1. 概述
BPFDoor是专门为Linux和Solaris系统设计的后门程序,攻击者可以远程连接到linux shell以获得受害者设备的访问权限,背后所属的APT组织主要针对中东和亚洲的电信提供商以及政府、教育和物流部门的实体。
该后门滥用伯克利数据包过滤器(BPF)来监听网络和过滤网络数据包,这是BPFDoor名字的由来,也是2022年来被发现的第二个基于BPF进行攻击的恶意程序,第一个是由盘古实验室公布的NAS后门bvp47。
PWC研究人员将该恶意程序归因于来自中国的APT组织Red Menshen, 该APT组织为2021年被PWC命名,归因原因是该组织在后利用阶段使用了Gh0st后门变种以及Mimikatz和Metasploit等开源软件、攻击时间与中国地区工作时间吻合等原因。这种归因方式是信誉度比较低的,因为其他国家的APT组织有时也会使用Gh0st后门,比如朝鲜国家支持的APT组织Lazarus。
2. 样本详情
文件名 | kdumpflush |
Md5 | 156226c90974180cc4b5f9738e80f1f8 |
文件类型 | ELF64 |
3. 流程图
4. 详细分析
BPFDoor不受防火墙规则的约束,并持续监听来自ICMP、UDP和TCP端口的数据包。当接收到包含特定数据的TCP或UDP数据包时,密码验证通过后执行后门操作,比如创建远程shell、修改防火墙规则等等。
使用BPF数据包过滤的方式无需开启入站端口、也不使用出站端口,因此无法被防火墙阻止,并且可以响应来自网络上任意IP地址的命令,非常适合隐身操作。
并且大部分linux操作系统都内置BPF的功能,因此执行数据包过滤所需的CPU开销较小。
BPFDoor使用动态编译时编译后的文件很小,只有几十K;目前发现BPFDoor存在Linux和Solaris SPARC两种系统版本。
4.1 判断lock文件是否存在
恶意程序在执行后会创建一个0字节的文件”auditd.lock”,用于标识恶意程序已经在执行中,再次执行时则检测”auditd.lock”是否存在,如果存在则退出程序。
恶意程序还会执行getuid来判断当前用户是否时root用户,如果不是的话则退出程序,因为后续需要执行的操作需要足够的权限才能够执行。
在节4.2的文件kdumpflush执行并将自身进程名修改成硬编码的linux daemon进程后,恶意程序创建SIGTERM信号处理恶意程序在正常结束程序时删除文件”auditd.lock”,但是非正常结束程序可能会留下该文件,比如出现强制关机或系统崩溃等问题。
如果存在 “auditd.lock” 文件将不会启动,因为该文件用于标记恶意程序可能已经在执行中。
当触发进程结束信号时判断程序程序pid是否是运行的恶意程序的pid,如果是则删除标记文件”auditd.lock”。
4.2 进程伪装
根据是否携带命令行参数来决定执行不同的操作,第一次执行时没有携带命令行参数,执行的操作是将自身拷贝到目录”/var/lock”并重命名为” kdumpflush”,设置权限为755,执行kdumpflush并执行命令行参数”init”。
路径“/var/lock”是程序保存锁定文件的地方,用于标记它们正在使用某个特定的设备或者文件,其他程序发现锁定文件时,将不再试图使用这个设备或者文件。
执行kdumpflash携带命令行参数”–init”,这时执行的操作是从10个硬编码的进程名中随机挑选一个进行伪装,然后调用函数daemon以守护进程的方式在后台执行,并将该程序的当前工作目录用函数chdir修改为目录”/”。
如下图所示,这些名称看起来像常见的Linux系统的daemon程序,恶意程序会用这些进程名的其中一个来覆盖参数argv[0]的值。
进程伪装实现如下,使用伪装进程名覆盖argv[0],然后使用函数prctl设置当前运行程序的程序名。当使用命令ps查询进程时显示的是伪装后的进程名。
4.3 修改文件时间戳
恶意程序将自身复制到路径”/dev/shm/kdmtmpflush”后,恶意程序修改该文件的时间戳为1225394236,转换成北京时间为 2008-10-31 03:17:16,修改文件时间戳的目的是为了隐藏对文件的修改痕迹。
4.4 BPF过滤器安装和激活
恶意程序在完成前述所有工作后进入函数packet_loop,packet_loop函数实现BPF过滤器的激活和解析数据包等等。
恶意程序使用AF_PACKET地址簌打开一个类型为SOCK_RAW的套接字,以便它可以监听网络流量并应用BPF数据包过滤器,BPF会根据g_bpfcode来允许或禁止某些类型的数据通过socket,因此恶意程序只需要对通过过滤器的数据包进行处理而不用处理所有的数据包。
使用函数setsockopt来安装BPF过滤器,BPF使用的过滤器被以字节码的方式加载。字节码g_bpfcode如下图:
转换成BPF字节码如下,其中 注释为功能描述,在BPF汇编中使用A作为累加器,X为寄存器,引用的内存数据为监听到的数据包内容。
1 | // 12为EtherType在Ethernet的偏移,加载该值到A |
反汇编后的汇编代码可读性很差,使用伪代码来表示大致代码如下
1 | if(EtherType != IPv4) |
数据包通过BPF过滤器后使用结构体sniff_ethernet、sniff_tcp、sniff_udp和sniff_icmp来解析对应的数据包找到payload数据,payload使用结构体magic_packet,内存布局如下:
1 | struct magic_packet{ |
由于不同的协议magicPacket所处的位置不一样,需要解析协议找到payload部分。
4.5 防火墙绕过
1. 匹配连接密码
BPF过滤器在防火墙之前接收或丢弃捕获的数据包,因此即使防火墙正在运行,恶意程序也会接收到包含由特定数据的数据包。
如果防火墙只允许部分端口通过,比如3306、443或80等等,攻击者也能向该端口通过发送包含特定数据的数据包来激活后门功能。
恶意程序收到包含特定数据的数据包后,从该数据中提取攻击者的IP地址,如果没指定则从数据包的IP协议层读取IP地址。恶意程序利用fork函数创建一个用于进程用于与攻击者进行通信,将其进程名修改为”usr/libexec/postfix/master”。
要想成功执行命令,还需要验证密码,密码由接收到的magicPacket包中提供。 该密码不仅是数据包验证密码,还作为恶意程序使用RC4算法加密通信流量的密钥。
恶意程序硬编码了两个密码的md5值,由于使用的是不对称加密方式,很难解密出使用的原密码。密码验证如下,将从magicPacket获取到的密码拼接到字符串” I5*AYbs@LdaWbsO”然后计算md5值,然后判断是否与内置的密码匹配。
恶意程序根据匹配结果的不同来执行不同的操作。如果密码匹配失败,发送一个值为”1”的udp数据包,这可能是在检测恶意程序是否存活;匹配pass2则建立本地binds hell。匹配pass1成功则建立反向bindshell连接指定的ip和端口。
2. BindShell
2.1 本地BindShell
恶意程序从端口42391到43390一次选择一个端口用于创建本地bindShell,然后修改防火墙规则将来自攻击者的IP的所有流量从请求的端口重定向到选择的端口。
修改的防火墙规则如下,在创建bindshell之前添加防火墙规则用于接收和重定向来自攻击者的流量,在接收数据后删除添加的两条防火墙规则避免被发现。这种数据包重定向的方法比较隐蔽,也更难找到,因为它能够重定向许多使用常用端口的数据流量,比如ssh、https和mysql等应用使用的端口,用抓包软件抓包的流量看起来就像是合法的流量。
2.2 反向BindShell
如果数据包magicPacket中的地址_ip2为不为空或0xFFFFFFFF,则向该地址发送ICMP数据包来转发恶意程序接收到的magicPacket和当前进程PID;否则就是恶意程序主动连接magicPacket中指定的攻击者IP和端口然后创建BindShell。
2.3 创建BindShell
当前进程是被伪装成”usr/libexec/postfix/master”来执行的,该进程fork出一个子进程用于执行shell操作,并且进程名伪装成”qmgr -l -t fifo -u”,设置了一些环境变量告知shell不要记录某些信息。
Linux恶意程序进程使用的shell一般都是通过管道来输入输出,对于一些需要编辑修改数据的shell命令就无法正常使用了,BPFdoor的方法就是创建伪终端来执行shell命令。
当要执行的命令字符中包含字符’\v’时执行修改伪终端窗口大小,然后再执行shell命令。分隔符’\v’前面四个字节指定要设置的窗口大小,后门字符为要执行的shell命令。
攻击者与受害者之间shell通信流量使用RC4算法加密,密钥由接收的magicPacket数据包中的字段pass指定。
6. IOC
/var/run/auditd.lock
Kdumpflush
156226c90974180cc4b5f9738e80f1f8
7. ATT&CK矩阵
Tactic | ID | Name | Description |
Execution | T1059.004 | Command and Scripting Interpreter:Unix Shell | 执行unix shell命令 |
T1204.002 | User Execution: Malicious File | 受害者执行恶意文件 | |
Persistence | T1205.001 | Traffic Signaling :Port Knocking | 使用PortKnocking技术来激活后门程序 |
Defense Evasion | T1562.004 | Impair Defenses: Disable or Modify System Firewall |
修改防火墙规则重定向通信流量数据 |
T1070.004 | Indicator Removal on Host: File Deletion | 删除锁定文件auditd.lock | |
T1070.006 | Indicator Removal on Host: Timestomp | 修改文件时间 | |
T1036 | Masquerading | 进程伪装成linux daemon程序。 |
8. 参考
https://www.tcpdump.org/pcap.html
https://www.kernel.org/doc/Documentation/networking/filter.txt
https://www.sandflysecurity.com/blog/bpfdoor-an-evasive-linux-backdoor-technical-analysis/
https://www.countercraftsec.com/blog/a-step-by-step-bpfdoor-compromise/
最后更新: 2023年11月01日 14:46:35
本文链接: http://shxi.cc/post/b3bbba67.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!