宿主机异常现象在植入病毒样本后,分析宿主机的异常行为,并定位关键文件。
通过自启动文件开始分析,逐步延伸到其他恶意文件。
作为用户登入时自启动程序,该文件主要用于检查其他模块是否正常运行。下面对其进行详细分析。
首先检查文件systemd-cgroup.service是否完好,若不存在或者被修改,则重新生成。
图5
检查文件systmd-deltaed.service文件是否完整,若被修改则重新生成。
图6
将服务配置文件加入服务组multi-user.target.wants和graphical.target.wants,实现服务自启动。
图7
检查systemd-deltaed以及备份systemd-deltaed.org文件是否存在,并通过md5检查文件完整性。
图8
经过上面文件分析,又获取到两个恶意文件,分别是systemd-deltaed和systemd-cgroup。下面对systemd-deltaed进行详细分析。
首先判断文件/usr/bin/systemd-cgroup是否存在。
图9
若文件不存在,则从/usr/bin/systemd-cgroup.org文件读取数据,复制到/usr/bin/systemd-cgroup文件。
图10
接着创建服务配置文件/lib/systemd/system/systemd-cgroup.service。
图11
判断/usr/sbin/sestatus是否可访问执行,并通过PIPE命名管道读取结果,查询SElinux是否关闭。
图12
若SElinux处于启用状态,则尝试调用setenforce 0命令或配置文件/etc/selinux/config关闭SE。
图13
图14
调用md5sum命令,检测服务配置文件是否改变,若hash不一致,则重新写入服务配置。
图15
获取系统内核版本,根据内核版本释放相对应的驱动模块。
图16
若驱动文件不存在,则根据传入的参数并结合不同的内核版本,将自身指定位置的数据保存为对应驱动文件。
图17
使用ELF文件MAGIC值搜索可以看到这里有两百余个针对不同版本的驱动文件。
图18
驱动文件生成后,首先会安装网络驱动,并卸载linux监控调试驱动sysdig。
图19
接着安装恶意驱动。
图20
当驱动文件生成失败或者加载驱动失败时,会根据当前的时间获取随机字符串后缀,拼接出完整路径,与排查时发现的恶意文件名称格式一致。
图21
在驱动文件释放阶段就失败的话,会清理日志,然后执行程序biosdecoded、blockdeved,删除这两个文件后重启系统。
图22
执行biosdecoded、blockdeved程序时,通过修改文件ns_last_pid来预定PID。
图23
在驱动加载阶段失败时,同样会清理日志文件,执行程序biosdecoded、blockdeved后,删除释放的驱动文件以及这两个用户层恶意程序文件。
图24
查询文件
/etc/collectd/certs/rctl_ca.crt、/etc/collectd/rctlcli.cfg是否存在。若不存在,则创建文件,将数据写入文件rctl_ca.crt(内容如下图)。经后续分析,这两个文件为远控程序配置文件以及公钥证书。
图25
将证书解析可以获取下面信息。
图26
以释放驱动文件一致的方式,释放下图所示的文件。
图27
通过在用户登入自启动目录下写入shell文件,实现恶意程序自启动。
图28
最后通过ns_last_pid指定PID号执行程序,并在执行后删除文件、清空日志文件、消除痕迹。
图29
此文件为驱动加载失败后首先执行的两个程序之一。下面将进行详细的分析。
程序执行后,判断是否存在以下两个文件,该文件为linux动态验证模块组件,若不存在则退出。
图30
使用文件hash检查文件pam_auth.so是否正确,hash不一致则读取自身数据,重新生成pam_auth.so文件,并使用touch命令修改文件时间与正常pam文件一致。
图31
修改pam重要配置文件common-auth或者password-auth-ac(不同linux发行版的配置文件有所不同)以及systen-auth-ac配置文件,将正常pam库模块pam_unix.so替换为恶意后门模块pam_auth.so。
图32
修改配置后,当程序需要进行相对应的安全验证时,调用的就是恶意后门模块pam_auth.so。修改前后对比图如下。
图33
该文件是一个动态共享库文件,通过与原始文件pam_unix.so导出表对比可以发现,恶意pam_auth.so的导出表函数与原始文件的一致。
图34
在函数pam_sm_authenticate中,实现以指定密码字符串登录任意账户,并将登入验证时所传入的用户以及登录密码使用凯撒密码加密后,存储在文件/usr/include/ilog.h中。
该任意账户密码为PMGS**56$wx*%*St。
图35
此文件同样是驱动加载失败后首先执行的两个程序之一。下面进行详细分析。
程序执行后,首先会删除原始文件ssh、scp,并释放恶意文件替换。
图36
经过分析发现,当使用ssh程序对远程主机进行连接时,恶意ssh程序会将用户输入的用户名、远程主机地址、用户密码记录到文件中,并使用凯撒密码对远程主机密码进行加密,文件目录为/usr/include/olog.h。
图37
文件内容示例如下图。由于scp是基于ssh连接后实现的文件传输,所以会在调用ssh实现远程主机、密码的窃取。
图38
下面对其余恶意组件进行详细分析,首先是telinited程序,该文件作为远程控制客户端,接收执行远程命令。
首先检查是否多开,通过标志文件/var/run/telinited.pid判断。
图39
执行mount命令,将pid为1的系统守护进程目录挂载到恶意程序的proc目录,以此达到偷梁换柱隐藏进程的效果。
图40
下面就进入到远程控制(rctl)客户端的逻辑代码。该恶意团伙所使用的程序是基于github开源rctl工具实现的一个远程控制程序,流程大致一致,这里就不详细分析,感兴趣可以访问[rctl](http://github.com/ycsunjane/rctl)。
图41
检查标志文件防止多开,使用挂载目录方式实现进程隐藏。
图42
将整理记录的本机账号密码以及远程中断的账号密码进行去重排序后,发送至目标地址log.softgoldinformation.com。
图43
检查运行标志文件,通过挂载隐藏进程文件。
图44
清理dmesg内核日志,且当系统日志中存在下图字符串时,便清空日志文件,借此隐藏恶意文件痕迹。
图45
该模块主要用于释放xmrig挖矿程序。在执行后需检查是否多开,并隐藏自身进程文件。
图46
需要判断挖矿程序是否运行。因为当挖矿程序运行一段时间后,就会关闭挖矿进程,重新生成随机进程名再次执行。
图47
若程序第一次执行,则释放文件名为gettexted+随机字符串,设置预定pid并执行。
图48
并在执行期间,每隔一段时间就清理一次日志文件。
图49
挖矿程序首先创建running标志文件。
图50
根据系统内存情况,连接不同矿池。
图51
本次捕获的样本为内核级rookit,从最底层隐藏文件、流量等信息,并清理与自身模块组件相关的日志记录。若非系统资源占用率高导致系统卡死,还不一定能发现踪迹。希望广大用户提高安全防范意识,拒绝弱口令,保持系统、应用、服务处于最新版本,并做好安全配置,以此加强主机安全防护,免受业务停止、资源占用等损坏。
三、防护建议
01 强化:密码管理建议用户在设定密码的过程中,尽量使用非字典中出现的组合字符,并且采用数字与字符相结合、大小写相结合的密码设置方式,增加密码被黑客破解的难度。而且,也可以使用定期修改密码、使密码定期作废的方式,来保护自己的登录密码。
02 限制:root用户权限管理Root一直是Linux保护的重点,由于它权力无限,最好不要轻易进行超级用户的授权。因为一旦进行授权,攻击者可以利用其他工具(比如sudo)让这类用户有部分超级用户的权限。
sudo不但限制了用户的权限,而且还将每次使用sudo所执行的指令记录下来,不管该指令的执行是成功还是失败。
03 设定:用户账号安全等级管理除密码之外,用户账号也有安全等级,这是因为在Linux上每个账号可以被赋予不同的权限,因此在建立一个新用户ID时,系统管理员应该根据需要赋予该账号不同的权限,并且归并到不同的用户组中。
04 设定:开放端口管理在各种web服务中,需要服务器开放不同端口进行正常通信。对于暴露在互联网中的服务器,更是需要关闭无关的网络端口,防止应用漏洞攻击。
05 横向扩展:综合防御管理防火墙、IDS等防护技术已经成功地应用到网络安全的各个领域,而且都有对应的成熟产品。
对于Linux系统,有一个自带的Netfilter/Iptables防火墙框架,配置合理的话也能起到主机防火墙的功效。在Linux系统中也有相应的轻量级的网络入侵检测系统Snort以及主机入侵检测系统LIDS(Linux Intrusion Detection System),能快速、高效地进行防护。
06 保持更新:补丁管理Linux作为一种优秀的开源软件,其稳定性、安全性和可用性极高。毫无夸张地说,因为有全球的Linux高手共同维护这个优秀产品,所以流通渠道很多。除此之外,也经常更新并发布程序和系统补丁。因此,为了加强系统安全,用户一定要经常更新系统内核。