【云攻防系列】Linux下的免杀测试与研究
序言
近年来,随着云计算与基于 Linux 的国产操作系统的发展,Linux 平台下的免杀在攻防对抗中愈发重要。
在一些测试中发现,如今在 Linux 服务器上反弹 shell 的命令渐渐不能满足测试的要求。因为如今各大云平台都已经针对反弹 shell 做出了很多防御方法,其中包括 shell 审计、流量识别等等。而且如今网上各漏洞的 EXP,包括 POC 都已经被各大云平台标识,想继续利用只能进行免杀处理。
本文将从免杀在 Linux 下的现状、国产操作系统上的免杀测试、容器逃逸中的免杀应用三个模块介绍 Linux 下的免杀测试与研究。
图1 container security
Linux下免杀现状
以往,免杀只是针对 Windows 平台的一些杀软,但是随着云计算,以及 Linux 国产操作系统的发展,Linux 平台的免杀也具有了很大的应用场景。
例如:
针对某基于 Linux 的国产操作系统上的数字安全软件以及别的杀毒软件。
在进行容器逃逸的时候,很多逃逸方法需要宿主机反弹 shell,但是平台的 shell 审计能监控到常见的反弹 shell 方法,想要拿到宿主机 shell 只能调用免杀的远控木马来获取。
当前网络上面很多漏洞的 EXP、POC 也已经被各平台标记识别,一旦下载就会告警,在使用过程中需要进行免杀处理。
图2 bash 反弹 shell 时产生的警告
图3 CVE-2016-5195 脏牛的 POC 文件产生的告警
如上文所说,各平台的防御工具虽然在严格监控,但并非无法绕过。
根据实际的测试,如某工具上的 encoder 模块,几十种编码方式,各平台也没有全部覆盖。虽然几大平台对于病毒扫描的强度不一,有强有弱,但是也无法全部扫描出经过编码混淆的远控木马。像最常见也是最有效的编码方式 x86/shikata_ga_nai
,很多平台都可以识别。但是从目前的测试结果来说,各大平台反而对于其他效果弱一些的编码方式无法扫描出来,比如,x86/jmp_call_additive
还有其他编码,都可以不同程度绕过这几个平台的扫描。
图4 某云平台上的免杀远控木马测试
图5 免杀技术概览
随着各云平台不断更新,编码混淆这种免杀方式,最终一定会被精准识别。能否在 Linux 上开发出更高效的免杀方法才是至关重要的,例如 LSB 隐写,内存加密,shellcode 拆分等等。
但是,以上都是基于传统的免杀方法。在如今 AI 技术愈加成熟的情况下,利用 AI 产生免杀样本已经成为了可能的途径。目前 Linux 平台 elf 免杀样本研究甚少,从目前的测试结果看,对抗的防御方法也并不出色,那么实现利用 AI 产生 elf 免杀样本,将在未来的对抗中占据优势。
某国产操作系统上的免杀测试
随着国产操作系统的发展,针对此操作系统的攻击也将愈演愈烈。免杀仍然是其中的重头戏。
在实际的测试中,国产操作系统上的适配杀软效果很不理想,远远没有他们在 Windows 平台上一样的查杀能力。虽然 Linux 系统本身有着各种安全措施,但是仍然不能忽略杀毒软件对系统带来的防护能力。目前来看,国产杀软在国产操作系统上的适配仍任重而道远。
图6 为 某工具编码后的木马成功上线
目前,容器逃逸主要分为以下四个方向:
图7 容器逃逸方向汇总
本文主要介绍在利用 CVE-2020-27352 进行逃逸时的免杀应用。
1 漏洞原理
Snap 某版本安装 docker
后,没有设置自身管理 docker cgroup
。导致 systemd
在 reload
之后,由于 systemd
会重新梳理 cgroup
树, systemd
接管了 docker cgroup
,造成 docker
容器进程获取到了额外的任意读写 devices
文件权限。而且以上过程都是在系统正常进行中完成的,不需要人为干预。下文主要介绍在当前权限下进行逃逸的方法。
不论传统渗透还是容器渗透,有一个思路是不变的:利用内核的高权限进程执行 payload,拿到高权限的 shell。利用内核的高权限进程执行 payload
拿到高权限的 shell。此时拿到 devices
任意读写权限之后,需要找出一个可执行 payload
的高权限进程。
这里可以使用内核转储文件机制。当有进程崩溃时,内核会去使用这个机制,这个机制写在 /proc/sys/kernel/core_pattern
中。而进程崩溃可以轻易在容器内实现。
图8 逃逸流程图
2 漏洞利用步骤
(1)使用 lsblk
查看宿主机设备。
根据宿主机设备信息,创建设备文件。
(2)将宿主机 apport 文件复制到容器内修改。
进程崩溃时,内核会调用转储文件机制。
这个机制写在在 /proc/sys/kernel/core_pattern
中:
可见默认执行 /usr/sahre/apport/apport
文件
注:如果 core_pattern 文件的第一个字符是管道“|” ,内核会将后面部分作为命令来执行。
使用 debugfs
,它支持直接从设备中写入读取文件:
进入 /usr/share/apport
,使用 stat
读取 apport 文件信息:
使用 d
命令从设备中将文件保存到容器内 /tmp 目录下
注:skip 的大小,由上文 stat
读取的数据中的 EXTENTS 的起始位置 x8
(3)添加攻击载荷,使其执行免杀远控木马。
打开保存到容器的 apport 文件,添加攻击载荷。文件是一个 python 脚本。向Python 文件中写入反弹 shell 语句的方法很多,比如使用 os.system()
执行 nc
,或者使用其他等等反弹都可以。
但是,这些常规的反弹 shell 都已经被重点监测,一旦直接调用,就会产生告警。而且通过其他的反弹 shell 方法来避开监测是非常低效的,只要平台在监测的匹配规则加入这种反弹 shell 语句,方法就立即失效。免杀的远控木马就有了应用的必要性。
上图 payload各步骤的内容含义如下:
将远控木马主动下载到本地
赋予执行权限
执行
木马文件是由某工具生成的远控木马,针对不同的平台使用不同的编码方式,各平台对于编码混淆的识别情况并不统一。
将上述过程写入到 apport 文件内,木马文件最终也会由系统执行,反弹回攻击者的主机 root 权限的 shell。
(4)将修改后的 apport 覆盖到宿主机原位置。
加入字符之后,删除文件里相应的字符数,以便文件大小不变。使用dd再次将文件放入到宿主机相应位置。
dd of=/dev/vda1 seek=5174680 count=64 if=/tmp/apport
攻击者在其他主机上打开某工具监听,等待宿主机反的木马上线。
(5)在容器内制造进程崩溃。
使用 C 语言程序造成进程崩溃。
int main(void)
{
char *aaa = 0;
*aaa = 0;
return 1;
}
攻击者可以在自己的服务器上编译完成,再放入到容器内,以防容器内无法编译。
至此,逃逸成功,拿到宿主机的 root 权限 shell。
随着国产操作系统以及云计算平台的发展,Linux 下的免杀对抗也将愈演愈烈。虽然目前各平台对于 elf 文件的查杀能力不太理想,但是未来也必将快速发展,仅靠目前的 Linux 下各种免杀方法也将逐渐跟不上测试要求。
多年之前,基于人工智能的病毒识别已经初现峥嵘。人工智能的介入,使得病毒与反病毒的对抗进入新的回合。但是通过 AI 生成 elf 恶意样本这块领域仍然是一片空白,未知攻焉知防,通过 AI 去生成免杀,不仅可以赋能蓝军,又能促进病毒与反病毒之间的对抗发展。因此,发展 AI 生成免杀的技术前景可观。我们创新研究院云安全研究团队也将对此持续探索研究。
深信服千里目安全实验室
深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。