在进行的许多渗透测试活动中,我注意到有许多攻击都是通过使用合法凭据的SSH访问开始的。现在你可能会想,用户究竟为什么要在macOS上启用SSH服务。这对普通用户来说真的有必要吗?当然,对于普通用户来说,答案是否定的。这完全没有必要,但我认为基于macOS的构建服务器、测试服务器和开发人员系统经常启用SSH的可能性很大。不仅如此,一旦攻击者通过任何方式获得了对系统的访问权,SSH就成了一种奇妙的“live of the land”技术,用于在受到攻击的网络上进行横向移动。
要理解如何最好地跟踪不同的SSH行为,我们首先必须熟悉在创建SSH会话中发挥作用的不同二进制文件。
- /usr/libexec/smd
smd二进制文件(可能是服务管理守护进程)实际上控制SSH是启用还是禁用。随着时间的推移,苹果将更多的责任转移到了这个守护进程中。
- /usr/sbin/sshd
这是主要的SSH服务可执行文件,当你尝试登录到一个系统时,会启动多个sshd实例,以便处理登录过程和用户会话,这可能是在处理SSH时想到的最常见的服务。
- /usr/libexec/sshd-keygen-wrapper
这个sshd帮助进程在尝试登录时启动,它通常立即执行sshd服务。在一些用例中,SSH -keygen-wrapper会执行一些不同的操作,但是在大多数SSH设置中,该进程的操作行为与名称完全一致。
- /usr/bin/ssh-agent (- l)
不管它的名字是什么,SSH -agent实际上并不是侦听SSH连接的服务。事实上,即使禁用了SSH,该进程也可能在你的系统上运行,它最以SSH密钥的管理而闻名。实际上,用户不需要通过用户名和密码登录即可。可以在/System/Library/LaunchAgents/com.openssh.ssh-agent.plist中找到启动程序,并在启动时使用未记录的-l参数加载该启动程序。
- shell
身份验证过程结束后,在系统上生成一个交互式shell,它将根据用户的请求执行命令。这个shell是用户设置为默认的shell。对我来说,它是zsh。
一般的行为
为了更好地理解这些进程是如何连接的,让我们看看通过SSH登录时使用的具体步骤。在macOS上,可以通过系统首选项>共享>远程登录来启用SSH登录。注意,启用这个特性实际上不会创建任何类型的任何新的sshd进程。这有点令人失望,因为这意味着我们不能进行简单的进程监视来确定SSH是启用了还是禁用了,但是如果你使用SSH登录并保持会话处于打开状态,你现在应该拥有如下进程树。
如果你查看标准ps输出,你会注意到这个树看起来有点不同。事实上,使用TrueTree是我意识到smd在SSH管理中发挥作用的唯一途径。这也是为什么在尝试登录之前,你的ps输出中没有任何SSH服务侦听器的迹象。smd服务处理多个不同的远程登录服务以及通过系统首选项启用或禁用的其他项,上面截图中smd下面的所有进程在登录尝试发生后都将存在,但是zsh shell在登录成功后出现。首先,我们看到创建了sshd-keygen-wrapper。这个小小的二进制文件在执行到sshd之前会快速处理一些检查,是的,当登录发生时将创建两个sshd进程。但是请注意,如果在此登录过程中发生另一个登录,将再次创建上面看到的所有相同进程。我的意思是说,上面看到的两个sshd服务都不会充当额外登录的“主服务器”。最后,第二个sshd实例将派生一个shell,用户今后输入的所有命令都将通过该shell派生。
在继续之前,请务必注意,还有其他方法可以启用SSHD服务。实际上,我认为通过系统首选项启用远程登录要比通过命令行启用更值得关注。用户可以使用systemsetup命令从命令行启用远程登录,而不是加载LaunchDaemon。
- sudo systemsetup -setremotelogin on
为了使此命令起作用,需要root权限,好消息是,你应该能够在执行此类命令时监视任何类型的EDR。
尝试登录
有了上面讨论的流程树,你可能已经知道我将在本节中进行的工作。如上所述,我们最终通过SSH登录尝试生成了三个进程:一个是sshd-keygen-wrapper,另一个是sshd。我们知道sshd-keygen-wrapper只存在一秒钟,然后才执行sshd,这是系统上可能进行的三次登录尝试。
请注意,在上图中,我们使用非TrueTree进程视图,因为这是EDR所提供的。这就是为什么将launchd显示为父级而不是smd的原因。
在上图中,你看到了三个尝试的SSH登录。有两个失败,因此从未生成shell(红色),另一个成功(绿色)。不管登录是否成功,sshd-keygen-wrapper总是按登录尝试的比例生成,这意味着我们可以通过跟踪登录执行来跟踪登录尝试。
获取字典攻击尝试
非常奇怪的是,现在还有人用字典攻击SSH。通常情况下,这是由Linux僵尸网络发送大量的凭证,试图以他们的方式进入公共的SSH服务器。在macOS上面向公众的SSH服务器也很少见,具体原因是什么?显然,我无法说明你的具体设置和工具,因此我只使用一些通用的Splunk术语,因为它往往是事件监视的标准。在这里,你最好遵循上面的逻辑,寻找sshd-keygen-wrapper的大型分组尝试。我发现使用Splunk的“bin”功能(也称为bucket)最容易做到这一点。
让我们分解一下具体的流程:
- event=process_create path=/usr/libexec/sshd-keygen-wrapper
查找执行sshd-keygen-wrapper的所有时间。
- bucket _time span=5m
将找到的sshd-keygen-wrapper进程分组到两分钟的时间窗口中。
- eventstats dc(host_name) as attempts by _time
以现在进行分类的进程为例,并按主机进行不同的计数以获取发生了多少次尝试,将这个新统计的字段命名为“attempts”。
- where attempts > 20
查找在一个两分钟的桶内发生了超过20次尝试的位置。
- stats values(host_name)
返回与上述条件匹配的主机名。
如果你的Splunk实例能够访问这种类型的数据,那么它将返回在两分钟内发生20次登录尝试的实例。你可以随心所欲地设置时间,但我怀疑两分钟内进行20次登录尝试可能表明存在恶意攻击。
进行单次登录
捕获成功的登录也不会太复杂,实际上,我将使用与以前相同的图像。
只要你的工具允许你通过父子关系建立连接,你需要做的就是在创建shell的任何时候都使用sshd作为该shell的父对象。请注意,在macOS上,默认的内置shell(如/ etc / shells中所示)为/ bin / bash,/ bin / csh,/ bin / dash,/ bin / ksh,/ bin / sh,/ bin / tcsh和/ bin / zsh。
从Splunk的角度来看,这里不应该有任何太复杂的东西。只要在shell运行时查找ppid路径为“/usr/sbin/sshd”的位置即可。请注意,在某些情况下,如果有人选择通过SSH运行单个命令而不创建交互式登录,这也会引起注意。例如:
ssh user@ip_address whoami
上面的命令不是创建交互式会话,而是通过SSH登录,执行whoami命令并将输出返回给运行它的客户端。sshd可执行文件通过将-c参数和发送方指定的命令一起传递给它创建的shell来执行此操作。
如果你要查找交互式SSH登录名,请查找在SSH下创建shell且命令行不包含其他参数(或CommandLine == Path)的时间。如果你只想通过SSH运行一次性命令,请查找命令行包含多个参数的时间。
获取根登录
通过SSH进行的登录显然不能保证发生了恶意事件,许多技术和开发人员都依靠SSH来激活它,以完成不同的任务。但是,这些技术和开发人员应以正常权限登录系统,然后通过sudo升级。以超级用户身份直接登录到SSH服务器并不被视为最佳实践。
许多进程跟踪技术提供了已执行进程的用户ID,通常将其称为uid。 Unix系统上的每个用户都被分配了一个uid。在macOS上,第一个用户的uid为501,根用户为0。通过查看创建的shell进程的uid,我们可以确定哪个用户已登录。这是使用基本权限登录的用户的树形示例。
在上图中,我们看到派生的sshd子对象和shell的uid与基本用户501的uid匹配,因此我们知道登录系统的用户不具有root权限。同时,我们看到登录之前的所有进程都由root用户拥有,这很有意义,因为sshd在系统上以root用户身份运行,并且在用户登录时根据用户权限移交。当然,如果有人以root身份登录,所创建的shell将继续为uid 0。因此,要检测SSH上的root登录,只需使用与上一节相同的方法,但是指定只关心在SSH下创建的shell的uid何时为0。
最后,我想简单地谈谈一个经常被忽略的项目,这个项目是tty。每当有人打开真正的交互式shell时,tty或teletype终端就会被分配。也就是说,用户可以输入命令,shell可以返回提示。如果没有tty,当sudo命令要求你输入密码时,你将无法与它进行交互。你只需要在无效区域上操作,tty就会被分配给创建的Shell进程,并将继续用于该SSH会话期间创建的所有子进程。
此时,你可以看到在登录时shell上的tty是/dev/ttys001。同样,这将取决于你的工具以及你的输入是实时检测到的还是可追溯的,但这意味着如果你发现恶意的SSH登录并能够查看tty字段,则只需将所有内容撤回即可,通过查找共享相同tty的进程来在该SSH会话中执行的命令。
唯一的问题是,当用户关闭tty时,它将在下一次需要时被重用。换句话说,如果该系统上的用户经常打开终端,则搜索使用/ dev / ttys001的所有进程可能还会为你提供由用户执行的一些较旧但合法的操作。如果发生这种情况,你可能还必须依靠一些时间表(或完全不同的方法)来撤回所有恶意SSH命令。
总结
正如本文中多次提到的,上面看到的很多查询都取决于你的技术和工具,但是最重要的是了解你的环境并了解哪些系统应实际使用SSH。对于在小型公司工作的人来说,这很容易,他们可以轻松掌握谁在哪里登录,但是对于大公司来说,监视这些项目也很重要。对于需要登录系统以执行操作的管理员来说,远程登录是一个非常棒的工具,但是从安全角度来看,但是从安全的角度来看,它们会带来三重威胁。
1.它们是内置的;
2.它们可以用于初始输入;
3.它们可以用于横向运动和攻击。
本文我们仅谈到了与SSH相关的流程活动是什么样的,在锁定SSH以及攻击者如何利用SSH方面,仍然有大量的内容需要探索。
本文翻译自:https://themittenmac.com/detecting-ssh-activity-via-process-monitoring/如若转载,请注明原文地址。