近年来,随着云计算与基于 Linux 的国产操作系统的发展,Linux 平台下的免杀在攻防对抗中愈发重要。
在一些测试中发现,如今在 Linux 服务器上反弹 shell 的命令渐渐不能满足测试的要求。因为如今各大云平台都已经针对反弹 shell 做出了很多防御方法,其中包括 shell 审计、流量识别等等。而且如今网上各漏洞的 EXP,包括 POC 都已经被各大云平台标识,想继续利用只能进行免杀处理。
本文将从
免
杀
在
Linux
下的现状
、
国产操作系统上的免杀测试
、
容器逃逸中的免杀应用
三个模块介绍 Linux 下的免杀测试与研究。
图1 container security
以往,免杀只是针对 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 进行逃逸时的免杀应用。
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 逃逸流程图
(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
,或者使用其他等等反弹都可以。