在最近的几年,Linux面临的一个日益严重的威胁—-基于无文件落地型的恶意软件。无文件恶意软件是指将自身注入到正在运行的Linux系统中,并且不会在磁盘上留下任何痕迹。现在已经有多种手法可以实现无文件攻击:
1.执行二进制文件后从磁盘删除自身。
2.在不写入磁盘的情况下直接将代码注入正在运行的服务器(例如,在PHP服务器通过易受攻击的输入来运行PHP代码)。
3.使用诸如ptrace()之类的系统调用附加到正在运行的进程,并将代码插入内存空间执行。
4.使用诸如memfd_create()之类的方法在RAM中创建一个可以运行的匿名文件。
在本篇文章中,我们将讨论如何检测最后一个攻击向量。
memfd_create()无文件攻击
首先,向大家介绍一个linux系统的底层调用函数memfd_create()。该函数允许您在RAM中创建驻留文件,将文件保存到RAM而不是文件系统本身。调用成功后,您就可以引用这个内存驻留文件,就像您操作磁盘目录中的文件一样。 在man中的描述:
memfd_create()创建一个匿名文件并返回引一个文件描述符。该文件的行为类似于常规文件,并可以进行修改,截断,内存映射等。但是,与常规文件不同,它位于RAM中并且具有易失性。
您可以将其理解为并不是在Linux主机上直接调用/bin/ls,而是将ls加载到RAM中,可以将其称为
发动进攻
关于memfd_create()的利用方式有很多种,它们都有相似的检测模式,所以使用哪种并不重要,在本文我们使用的是:In Only Memory ELF Execution。
我们可以直接通过SSH传输二进制文件,这样就没有任何内容写入磁盘,也没有产生任何交互式shell,这样做可以大大降低攻击被检测的可能。