Linux 中的 L 代表横向移动
简介
在讨论不依赖漏洞利用的 横向移动 技术时,攻击者可以采用多种合法的协议和工具:PsExec、RDP、SSH、WMI 等。其中的大部分协议和工具通常只在 Windows 机器中可用。而涉及到 Linux 机器时,人们只会想到一个协议,那就是 SSH。在本篇博文中,我们将探讨 Linux 中可用于实现(或有助于实现)横向移动的其他协议。
当然,Linux 并不是操作系统,而只是内核。更准确地说,我们将探讨的是基于 Linux 的操作系统,或者说 Linux 发行版。尝试找到一个适用于多种发行版且开箱即用的通用服务或协议几乎不可能(甚至 SSH 在所有发行版中也不是以开箱即用方式直接安装的)。因此,我们将把重点放在较为出色的协议和服务上,而不管它们来自哪个 Linux 发行版。
本篇博文的用意并非充当 Linux 黑客攻击指南,而是让网络防御者了解可能影响其网络的潜在威胁。
除了 SSH,您还能做什么?
本篇博文中所涉及的大多数(如果不是全部)协议都不是开箱即用的,而是必须以特定方式进行配置才能实现横向移动。 我们不会提供有关滥用本博文中所涉及协议方面的指南。
对于可能会被配置为易遭攻击者滥用漏洞的其他协议,我们希望防御者能够增加对这些协议的了解。即便我们不透露文中所探讨的这些协议,不达目的不罢休的黑客也能够并且将会找到并滥用这些协议,我们希望作为防御者的蓝队能做好应对准备。
为进一步帮助防御者做好应对准备,我们与 Infection Monkey 团队展开了合作。Infection Monkey 是一个开源的自动入侵和攻击模拟平台,可以针对许多常见的横向移动和网络传播技术测试您的网络。
该开发团队采用了我们的研究成果,并将其作为一种新的漏洞利用技术纳入到工具中。 防御者可以使用 Infection Monkey,针对本博文中提到的一些远程执行技术测试其网络公布了其他可疑的文件路径。
挑选候选项
[注意:本部分介绍的是我们用于查找理想横向移动目标的方法。如果您对该方法部分不感兴趣,想直接阅读操作部分,请阅读: 支持立即执行代码的协议。]
由于我们寻找的是横向移动协议和服务,因此在寻找潜在候选项时,可以同时考虑操作系统方面和网络方面;也就是说,我们可以寻找 Linux 机器中最常见的进程,或者也可以查找最常见的侦听端口。我们不应只顾一个方面而忽略另一个方面,因为同一协议可能有不同的实现(不同的进程名称,相同的端口),或者一个进程有多个端口或端口不断变化(如 RPC 中的临时端口)。
当我们查看与 Linux 机器通信时所用的主要端口时,我们发现 SSH(端口 22)在列表中占主导地位,但也可以调查其他潜在的候选端口: FTP (端口 21)、 SNMP (端口 161)和 Sun RPC (端口 111)。
此外,少数端口尽管与 SSH 毫无关系,但也由 sshd (SSH 守护进程)进行处理。我们假定这些端口已在 SSH 隧道中使用,因此不在我们的调查范围之内。
以 135 和 5985 端口为例,它们在 Windows 中分别用于 RPC 和 WinRM。我们不希望 Linux 机器使用这些端口,尤其是当 sshd 负责侦听它们时更是如此。Linux 机器上很可能已开放了一个允许从外部访问内部机器的 SSH 隧道。由于 SSH 隧道只是将流量重定向到其他接收者,因此在考虑横向移动到隧道主机时,此类隧道并不那么重要。
在我们的调查中,出现了两个值得关注的进程—— xinetd 和 rpcbind。这两个进程无法作为横向移动目标,因为它们并未提供很多功能;其用途主要是查找操作,以将通信和端口映射到其他进程。所以,我们反而可以利用这两个进程来查找其他服务。
xinetd (及其前身 inetd)用于控制和管理守护进程。从它所管理的守护进程的默认列表,我们可以发现 rexec,以及 rlogin 和 rsh均为 Berkeley r 命令 套件的一部分。此外,我们还会发现各种 FTP 守护进程、 VNC 和 Telnet。
rpcbind 是 Sun RPC 的 RPC portmapper 进程。RPC 服务器向 portmapper 注册端口,而客户则可通过查询 portmapper 找到该服务器的临时端口。与 MS-RPC 不同,Sun RPC 使用程序编号来识别特定的 RPC 服务器,这些服务器已向 互联网号码分配局 (IANA) 注册。查看注册的程序,我们会发现一些值得关注的名称,如 rexec 和 NFS。
支持立即执行代码的协议
SNMP
24% 的经测试 Linux 机器
简单网络监控协议 (SNMP) 用于进行监控。机器运行一个通常称为 snmpd的守护进程,该进程可侦听通过 UDP 端口 161 的连接。尽管 SNMP 通常用于查询机器参数和统计数据,但也可以使用该协议远程设置一些参数和配置。早期版本的 SNMP(v1 和 v2)也没有太多加密或身份验证,只需一个密码(称为“社区字符串”),此密码有可能通过网络流量窃听,也可能被暴力破解。
事实证明,利用 EXTEND 插件,也可以通过 SNMP 运行远程命令 ,该插件在旧版本的 SNMP 代理中是默认加载的。虽然此选项在较新版本的 SNMP(v5.8 及以上)中禁用,但一次半相关 CVE之后,我们还是发现了安装有 SNMP 漏洞版本的环境。此外,您也可以搭建自己的 SNMP 代理并启用 EXTEND 插件(图 1)。
不论 SNMP 的内置功能如何,它也是 攻击者的目标,一些攻击者会利用路由器和物联网设备内 SNMP 实施中的漏洞来破坏网络。SNMP 滥用程度严重,以致网络安全和基础架构安全局 (CISA) 不得不发布了 关于该协议的安全公告。
为帮助对此威胁展开测试,我们与 Infection Monkey 团队合作为 SNMP 远程 EXTEND 插件开发了一个漏洞利用插件。运行 Infection Monkey 后,您可以看到这种攻击在您的环境中是什么情况,并验证您的安全态势是否足以抵御这种攻击。SNMP 攻击可以在最新的 Infection Monkey 版本 v2.2.1中发起。
远程桌面协议
10% 的经测试 Linux 环境
不,我们并不是在专门讨论 RDP,即 Microsoft 专用的远程桌面协议(但此协议也会出现,不必担心)。此外,还可以在 Linux 机器上运行其他远程桌面协议。但这种情况并不如 Windows 环境中那么常见,因为 Windows 环境旨在共享图形桌面,而大多数 Linux 服务器在安装时无需任何桌面环境。
然而,我们确实在个别网络中看到了这类协议,因此它们也榜上有名并在此处列出:
X Window System 是一个可用于 Unix 的桌面窗口系统,并且它也可用于侦听远程连接。它使用 TCP 端口 6000+(从端口 6000 开始,随后每次运行桌面服务器,端口号都会相应增加)。
VNC 基于远程帧缓冲 (RFB) 协议,使用 TCP 端口 5900+(与 X 类似,每次运行桌面服务器,端口号都会相应增加)。
Xrdp 是 Microsoft RDP 协议的实现,可在非 Windows 机器上使用。作为 RDP 的一个实现,它使用端口 3389。
某些远程桌面协议比其他协议更安全,但它们都有可能遭攻击者 滥用 。在 Linux 中也有多种协议的实现,因此我们在这里使用端口号,而非程序名称。
Telnet
4% 的经测试 Linux 环境
与 SSH 和 rlogin非常相似,Telnet 也是一个用于远程控制台和远程控制的协议。与 rlogin类似,它也是一个不安全且未加密的协议,容易受到拦截或包嗅探攻击。我们发现,在检测过的网络中仅有约 4% 存在此协议,但这意味着此协议仍在被使用,并可能影响您的网络。该协议使用 TCP 端口 23 或 2323。
Berkeley r 命令
1% 的经测试 Linux 环境
Berkeley r 命令是一套程序,可支持在网络中的机器上进行远程操作。该套件最初作为 BSD 的一部分开发,但很大程度上已被 SSH 所取代,这主要是因为此类协议存在安全问题(没有加密,最低级别甚至不存在任何身份验证)。
尽管如此,我们还是会看到散落在各处的一些该套件的守护进程,所以现在完全将其排除还为时过早。这里我们希望重点介绍三个守护进程:
rexec——提供远程命令执行,使用 TCP 端口 512
Rlogin——提供远程登录和控制台,使用 TCP 端口 513
rsh——与 rexec 类似,但不需要认证,使用 TCP 端口 514
我只是出于探讨目的才把这些内容放在这里——支持文件传输的协议
即使不直接支持远程控制或执行,只要能够将文件传输到目标机器上,便可证明对攻击的演进起到了推波助澜的作用。比如,我们来看一下常见的横向移动技术(也是工具)PsExec,尽管该技术基于 Windows,但也无妨。
首先,PsExec 通过 SMB 将其服务二进制文件复制到目标机器,然后才通过与服务管理器的远程通信,使服务运行。因此,我们认为有必要将攻击者工具和二进制文件在目标机器上的各种放置方式也绘制出来。此外,我们还从理论上提出了几种滥用工具传输以实现远程执行的方法,我们 稍后 将在本文中讨论。
FTP
31% 的经测试 Linux 环境
文件传输协议 (FTP) 是较为经典的协议之一(网络课堂上介绍的首个应用程序层协议)。该协议是一个基于文本的协议,用于文件传输,由于采用明文,因此并不安全。
Samba
20% 的经测试 Linux 环境
Samba 是一个有助于实现 Windows 互操作性的程序套件。该套件可实现 SMB 协议(TCP 端口 445),可以承载文件服务器或与之交互。此外,还可以与 Active Directory 集成,或充当域控制器(图 2)。
虽然 SMB 本身只是一个数据传输协议,但与 Active Directory 集成后,意味着您可能会发现 RPC 服务器和客户端的多种实现方式,这可能会产生大量的潜在横向移动路径。
幸运的是,我们没有发现滥用 Samba 进行横向移动的任何明确方法。由于 Samba 只关注如何让各项操作顺利进行,很多不必要的 RPC 逻辑和功能均未实现,因此攻击面有限。从整个源代码中的各种注释来看,代码中的检查也比较少。
在使用 Samba Active Directory 时,即使没有明显的横向移动路径,谨慎起见,也要让一支红队检查一下域控制器的安全性。
NFS
18% 的经测试 Linux 环境
网络文件系统 (NFS) 是另一种创建文件服务器的方式。该系统基于 Sun RPC(TCP 端口 111)搭建。有许多可供查看的 RPC 函数,但我们没有找到一种即时方法来远程执行命令。
rsync
16% 的经测试 Linux 环境
rsync 是一个用于在网络中的机器之间传输文件并实现同步的工具。它可以作为服务或守护进程运行,并可以通过其专用协议(TCP 端口 873) rsh 或 SSH提供文件。
通过文件传输进行远程执行
我们可以随意讨论文件传输,但除非攻击者能够以某种方式执行所传输的文件,否则作用不大。除了欺骗用户自己执行文件之外,我们还想到了两种执行方案,这两种方案都需要某种错误配置,或者是(极度)放松安全设置。
远程持久性
在 Linux 文件系统中,有许多合法位置可用于安装持久性组件,但对于横向移动来说,我们会关注 /etc/cron.hourly。如果攻击者能在那里上传一个具有执行权限的文件,那么就会在下一个小时执行此文件,从而实现期待已久的横向移动。
但是,要执行此操作,攻击者需要具有 sudo 或 root 权限,此类权限并不易获得。遗憾的是,文件服务器有可能以不安全方式配置,从而允许这一情况(比如,参见 rsync)发生。为何会有人为这些服务配置如此低的安全性?因为这样做省事,并使生活更轻松。请不要做这样的人,您要提升自身的防护能力。
Web shell
更合理的方案是远程访问某个活跃 Web 服务器的 Web 根文件夹,而不是访问 /etc。在这种情况下,应该可以上传一个自定义的 Web shell,并用它来执行远程命令。网上有很多 Web shell 的示例 ,攻击者甚至可以直接借鉴。
容器不应泄漏,对吗?
严格做好自身防护
既然我们已经介绍了攻击者入侵机器的各种可能途径,下面我们来介绍如何防范这些攻击者。
监测
如前所述,我们在这里讨论的协议均未以开箱即用的方式在 Linux 上安装和配置。需要有人专门去安装。因此,首要任务是对网络中正在运行和通信(或侦听通信)的内容进行有效监测——正如孙子所言,“不知彼,不知己,每战必殆。”
配置
在对您的网络进行资源清册并发现了文本讨论的某一服务后,下一步就是检查这些服务的配置。例如,配置为将 SNMPv3 与 Kerberos 身份验证一起使用的最新 SNMP 代理非常好。SNMPv2 带有一个容易猜到的社区字符串?则不太好。
通过隐匿来实现安全
其他协议或服务也许可以替换为更新、更安全的协议,比如用 SSH 代替 r 命令套件或 Telnet。FTP 或 rsync 等某些协议也可以通过 SSH 进行封装,以获得加密 SSH 所带来的额外好处。毫无疑问:同样必须确保使用 PKI 或不容易被破解的强密码来正确配置 SSH。
分段
即使所有通信都安全,也并不意味着人人都应该能访问一切内容。扁平化网络便于攻击者传播恶意内容; 分段网络 则为攻击者设置了更高的障碍(图 3)。
如果攻击者进入网络时,每一步都费尽周折,耗费许多资源,那么从成本效益的角度来考虑,他们可能会放弃攻击。此外,攻击者在网络中的必要操作越多,安全系统就越有机会检测到漏洞并发出警报。然后,您可以开始事件响应程序,击退攻击,修复漏洞。
总结
本篇博文中,我们重点讨论了 Linux 机器上常见的几种协议和程序,当攻击者试图在网络间横向移动时,这些协议和程序可能非常有用。我们专门进行了筛选,不会包含具体的例子,因为我们旨在使蓝对一方做好防护。我们希望提高大家对这些协议的认识,从而使网络不再具有安全薄弱环节。
至于防御或防护措施,我们建议使用本博文中讨论的安全版本的协议(SNMPv3、SFTP,而非 FTP 等)。另外,在可能的情况下,我们建议过程中采用网络分段策略。
对于文中讨论的大多数协议,通常都有一个小的客户端或服务器进程子集,以及唯一的端口号或端口范围。因此,应该可以通过阻止需要访问网络的服务器子集的特定端口或进程来限制网络访问,且不会对正常网络操作产生很大影响。