从BPFdoor浅谈Linux隐蔽后门检测

admin 2022年6月30日01:27:15从BPFdoor浅谈Linux隐蔽后门检测已关闭评论202 views字数 3421阅读11分24秒阅读模式

1.基本情况

最近看到几篇有关BPFdoor隐蔽后门的报道:“BPFdoor:隐秘的Linux恶意软件绕过防火墙进行远程访问。最近发现的一个名为BPFdoor的后门恶意软件已经悄悄地将目标锁定在Linux和Solaris系统上五年多没有被发现。BPFdoor是一个Linux/Unix后门,允许威胁参与者远程连接到Linux外壳,以获得对受损设备的完全访问。”经过搜索查找发现最早的报道来自一家新西兰的安全公司Sandfly
Security,链接地址为https://www.sandflysecurity.com/blog/bpfdoor-an-evasive-linux-backdoor-technical-analysis/。根据该篇文章的介绍,BPFdoor是一种可绕过防火墙的隐蔽Linux/Unix后门。该后门不需要打开端口,不能被防火墙阻止,可以响应来自任何IP地址的命令,使其成为企业间谍和持续攻击的理想工具。并且该后门具有以下恶意行为:

一、驻留内存,部署反取证、隐蔽手段;

二、利用BPF(伯克利数据包过滤器)嗅探网络流量;

三、可被网络激活进行远程命令控制;

四、通过进程伪装隐藏操作以避免被检测。

在这篇文章中提供了一份被匿名公开的后门源代码,让我们来看看这个后门究竟是怎么一会儿事。

2.源码分析

源代码共30KB、900行,编译后大小也就29KB,为C语言编写,非常的精炼简洁。先来简单分析下整个执行流程。找到main函数,主要做了几个事:

隐蔽执行,移动二进制文件自身到/dev/shm/目录下,然后执行后直接删除。

伪造进程名,从内置的常见系统守护进程名称中随机选取一个作为自己的进程名:

从BPFdoor浅谈Linux隐蔽后门检测

篡改样本文件创建时间。通过utimes修改源文件的创建时间,规避安全审计;然后通过调用fork()脱离终端后台执行packet_loop()函数。

进入packet_loop函数,设置BPF过滤器,监听指定的网络数据包,看着这个是编译后的BPF过滤器字节码暂时没能力分析,先跳过。猜测应该会只保留具有magic_pkt特有特征的数据包,以减少这个后门的负载。

从BPFdoor浅谈Linux隐蔽后门检测

接下来根据不同传输层协议,提取应用数据到固定数据结构magic_packet:

从BPFdoor浅谈Linux隐蔽后门检测

如果这个数据提取成功,重新fork一个进程来处理shell交互逻辑,在这里同样将进程名称伪造为常见系统守护进程postfix:

从BPFdoor浅谈Linux隐蔽后门检测

然后就是根据magic_packet数据结构中的成员pass执行以下不同的操作:

(1)如果pass=socket调整iptables规则,重定向攻击者流量到shell进程新端口,建立C&C通信。这里使用了iptables进行NAT端口转发:

从BPFdoor浅谈Linux隐蔽后门检测

```bash
/sbin/iptables -t nat -A PREROUTING -p tcp -s %s --dport %d -j REDIRECT --to-ports %d

将来自C&C的网络包转发给新创建的shell进程端口

因为只重定向攻击者IP的流量,所以正常业务完全不受影响

/sbin/iptables -I INPUT -p tcp -s %s -j ACCEPT

将C&C地址加入入站白名单

```

在建立连接之后,立马就停止端口监听:

从BPFdoor浅谈Linux隐蔽后门检测

并且删除刚刚添加的规则,如下所示。已建立了的连接不受影响,可继续保持通信,更不容易被发现。

从BPFdoor浅谈Linux隐蔽后门检测

接下来就是启动/bash/sh,建立C&C通信,启动shell进程时同样擦除进程环境变量、伪造进程名为常见系统守护进程Postfix“qmgr -l -t fifo -u”。

从BPFdoor浅谈Linux隐蔽后门检测

建立C&C通信后会马上回复固定内容“3458”,如上图所示。若复用应用层端口,则可能会违反应用层协议。

C&C通信过程所有应用层数据使用“socket”作为密钥进行RC4加密。

(2)如果pass=justforfun直接反向连接到给定的IP和端口,建立C&C通信;

(3)如果pass为其他值,则回复一个固定内容(“1”)UDP应答包,猜测应该是存活探测。

简单整理一下,如下所示:

3.执行流程

一、通过BPF嗅探网络流量,检测数据包中是否包含特殊数据结构。

二、若特征数据结构存在,则解析读取出ip、port、pass;

三、进行远程控制:主动连接到指定的IP和端口进行shell交互;或者监听一个本地高位随机shell进程端口(42391-43391),修改防火墙规则将指定IP和端口的数据重定向到这个随机shell进程端口;或者向目标IP和端口回复一个固定内容UDP报文。

整体流程如下所示:

从BPFdoor浅谈Linux隐蔽后门检测

4.行为特征分析

根据以上源码分析,构造一个对应远控端程序进行测试。由于不清楚那段已编译的bpf规则字节码(有大佬知道嘛),测试时直接替换bpf字节码为“tcp[(tcp[12]>>2):4]=0x6F000000”,意思是tcp协议上层应用首个4字节数据为111,这样就只监听magic_packet。

从BPFdoor浅谈Linux隐蔽后门检测

同时远控端这边也将magic_packet中的flag字段置为111:

从BPFdoor浅谈Linux隐蔽后门检测

被控端这边执行后通过执行ps对比发现,新增一个进程“/usr/lib/systemd/systemd-journald”:

从BPFdoor浅谈Linux隐蔽后门检测

由于正常程序一般不会自删除或直接从内存中启动运行,因此可通过“ls -l
/proc/*/exe 2>/dev/null|grep deleted”可发现该后门进程:

从BPFdoor浅谈Linux隐蔽后门检测

开启Wireshark进行抓包,然后在另一台机器上执行远控端程序模拟C&C:

从BPFdoor浅谈Linux隐蔽后门检测

而此时已经没有新打开的端口和新建的防火墙规则。

从BPFdoor浅谈Linux隐蔽后门检测

简单分析下这个过程中的流量,其中192.168.232.12模拟受害者主机、192.168.232.13模拟C&C。

第一个流是magic_packet包到sshd,然后主动关闭连接:

从BPFdoor浅谈Linux隐蔽后门检测

第二个流就是C&C通信,从网络层面看没有依然是与22端口建立连接没有区别,可以看到第一个包固定内容为“3458”,而流量被RC4加密了无法识别。

从BPFdoor浅谈Linux隐蔽后门检测

由于通信内容违反了SSH协议,因此可发现以下畸形报文警告:

从BPFdoor浅谈Linux隐蔽后门检测

若复用的端口改为HTTPS默认端口443,经过测试发现就不会违反协议,也就无法从流量层发现任何问题:

从BPFdoor浅谈Linux隐蔽后门检测

从BPFdoor浅谈Linux隐蔽后门检测

C&C通信中,检查被控主机进程信息,发现1366为后门的shell进程,以postfix用户运行的“qmgr -l -t fifo -u”才是真实的postfix系统守护进程。

从BPFdoor浅谈Linux隐蔽后门检测

5.反取证反检测行为总结

一、流量反检测:使用RC4对C&C流量进行加密,旁路设备难以检测加密流量;由于BPF工作在基于Netfilter的主机防火墙之前,因此已有的任何防火墙规则对它没有作用,并且由于可复用业务端口(白名单),因此难以被检测;

二、网络反检测:后门运行后,不会提前打开新端口一直监听,而是在收到magic_packet特殊数据报文激活后门时临时开一下,建立C&C通信后就立即停止shell端口监听、删除添加的NAT防火墙策略。因此只有持续地监测iptables规则、端口侦听事件才能发现;

三、进程反检测:通过prctl函数、覆盖argv[0]伪造进程名为常见系统守护进程;并擦除进程环境变量;混在大量进程中迷惑分析者;

四、文件反检测:将二进制启动文件复制到/dev/shm/目录下(内存里的临时文件系统,重启销毁),启动进程后就直接删除。并伪造原始文件创建时间。

6.针对性检测手段

根据以上分析可知该后门主要针对使用iptables的Linux系统,使用firewalld的系统将无法正确运行(但是firewalld也同样可以通过修改命令以支持端口转发)。可以采取以下针对性排查措施:

一、通过全流量设备,排查违反协议的畸形数据报文(可能为隐蔽隧道);

二、排查系统上无文件启动进程:“ls -l /proc/*/exe 2>/dev/null|grep deleted”;

三、排查防火墙规则,是否存在非法NAT转发:iptables -nL -t nat;

四、检查异常系统进程。是否存在多个系统进程、或以非默认服务账户启动的系统进程。/usr/lib/systemd/systemd-journald、sshd、qmgr等;

五、排查自启动项。该后门没有自启动配置;

六、检测BPF filter。由于其使用的是cBPF,并未劫持系统API,内核兼容性很强,也无法通过bpftool prog检测。但可通过tracee/strace等运行时取证工具,跟踪对setsockopt SO_ATTACH_FILTER的系统调用;

七、部署使用EDR,关注新端口监听、shell进程执行事件。

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月30日01:27:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   从BPFdoor浅谈Linux隐蔽后门检测https://cn-sec.com/archives/1148859.html