1
背景
近日,牧云主机安全软件帮助用户检测并协助处置一起TeamTNT蠕虫感染事件,事后复盘该蠕虫使用了多种攻击逃逸技术进行自身的隐藏。本文主要结合实际的蠕虫事件介绍主机安全软件的对抗手段,从而阐述主机安全软件如何自我修炼,从而可以有效地应对持续迭代更新的恶意软件及其逃逸手段。
2
事件概述
事件的起源是一起异常网络连接告警引发的应急响应。
发现告警之后,上机排查发现并没有看到相应的进程,判断可能存在进程隐藏等对抗行为。利用牧云的安全基线进行分析,果然发现有两个rootkit。
通过加载LKM模块实现进程隐藏和rootkit自身的隐藏。
通过ld.so.preload在用户态实现进程隐藏。
参考牧云的解决方案对rootkit进行清理后,所有的后门进程都无所遁形,根据指引完成后门清理成功结束应急响应。
下文将继续结合这个典型的蠕虫来阐述牧云是如何有效和其对抗的技术实现。
3
主机安全的自我修养
本次感染的蠕虫虽然通过各种手段实现进程的隐藏进行逃逸,但牧云仍能够有效的发现其异常网络连接,核心是通过tracing+kprobe实现有效的主机事件采集。
kprobe是Linux内核提供的一种动态调试机制,即Kernel Probe,用于收集内核函数运行时信息分析和监测内核函数的执行。相较于用户态通过hook libc的方式采集系统调用信息,kprobe直接在内核态进行监听,无论是采集率和对抗rootkit隐藏逃逸都更具优势。
相较于另一种在内核hook系统调用的方式进行事件采集,kprobe作为内核原生提供的调试机制具有更好的稳定性,这对主机安全软件也是至关重要的一环。而相较于内核新引入的ebpf等方式,在内核版本2.6.9即引入的kprobe无疑具有更广泛的普适性。
那么如何通过tracing+kprobe实现网络连接事件的采集,下面我们通过linux提供的ftrace框架,操作/sys/kernel/debug/tracing/文件系统来简单分享一下kprobe事件采集的实现。
针对TeamTNT蠕虫异常网络连接监控举例,首先我们需要通过ftrace注册一个kprobe监听事件,并针对监听的函数的ABI约定来选择需要采集的数据。因为是监听建立网络连接,我们选择__sys_connect系统调用,通过如下命令我们可以注册一个名为justtest的kprobe监听事件。
echo -n 'p:justtest __sys_connect FD=%di:s64 Family=+0(%si):u16 Port=+2(%si):u16 Address=+4(%si):u32 Len=%dx:u64' /sys/kernel/debug/tracing/kprobe_events
接下来,我们需要启用我们所注册的kprobe监听器,具体实现仍然是操作tracing文件系统,相应命令如下。
echo 1 > /sys/kernel/debug/tracing/events/kprobes/justtest/enable
最后我们就可以通过解析/sys/kernel/debug/tracing/trace对应的输出,分析是否有可疑的网络连接请求。
作为一个优雅的主机安全产品牧云兼具深度的洞察能力,在TeamTNT蠕虫事件中,牧云通过用户态工具对内核的内存分布进行深度的洞察,从而有效检出蠕虫使用LKM rootkit,下面我们详细阐述牧云是如何洞察rootkit隐藏痕迹。
对LKM rootkit的发现,牧云是基于对比内核中/proc/kallsyms符号表和内核的内存镜像/proc/kcore从而发现系统调用被异常篡改,最终实现威胁检出。
首先我们需要分析kcore来查找系统调用的地址,首先我们通过readelf获取kcore中内核代码的偏移地址。通过读取代码段的偏移地址,其中VirtAddr-Offset即为内核态逻辑内存地址映射到/proc/kcore文件中的偏移位置。
然后通过kallsyms获取系统调用表的偏移地址
'R sys_call_table' /proc/kallsyms grep
ffffffffbc2013c0 R sys_call_table
基于上面获取的信息,可以计算出在kcore中系统调用表的偏移地址为
0xffffffffbc2013c0-(0xffffffffff600000-0x00007fffff603000)=0x7fffbc2043c0,通过hexdump来读取系统调用表的内存地址为一个平坦数组,我们可以通过系统调用号作为下标直接获取对应系统调用的跳转地址。
bb4d2d60ffffffff
bb4d2e80ffffffff
bb4cea30ffffffff
bb4ccae0ffffffff
bb4d7ec0ffffffff
bb4d80e0ffffffff
bb4d7f80ffffffff
bb4ebef0ffffffff
最后我们将kcore中获取的系统调用地址和kallsyms中的符号地址进行对比,可以看到sys_kill系统调用存在异常。后续我们可以进一步基于内存异常找到对应进行系统调用劫持的内核模块,在这里就不详细阐述了。
从上面蠕虫逃逸的对抗过程可以看出,作为一款主机安全软件,面对不断升级和迭代的恶意软件,健壮的感知能力和深度的洞察能力是我们能够持续检测的基础和自我修养。
IOC
IP
220.167.141.174
205.185.118.246
URL
hxxp://205.185.118.246/b2f628/cronb.sh
hxxp://kiss.a-dog.top/b2f628/m/xm.jpg
hxxp://kiss.a-dog.top/s3f815/d/h.sh
hxxp://kiss.a-dog.top/s3f815/d/w.sh
hxxp://kiss.a-dog.top/s3f815/d/d.sh
hxxp://kiss.a-dog.top/s3f815/d/c.sh
hxxp://kiss.a-dog.top/bWVkaWEK/zgrab
hxxp://kiss.a-dog.top/bWVkaWEK/1.0.4.tar.gz
hxxp://kiss.a-dog.top/b2f628/m/xm.tar
hxxp://kiss.a-dog.top/b2f628/d/ai.sh
hxxp://kiss.a-dog.top/b2f628/d/ar.sh
hxxp://kiss.a-dog.top/b2f628/b.sh
hxxp://kiss.a-dog.top/b2f628/s/s.sh
MD5
b66fe14854d5c569a79f7b3df93d3191
7691c55732fded10fca0d6ccc64e41dc
8fbbe3860823e397f3be82fa78026238
ded99b45dd74384689b276b1b35bce64
1e2bb44cd88e4763db54993638472f62
974edee6a70b66eac6de05045e542715
原文始发于微信公众号(长亭技术沙盒):从TeamTNT蠕虫检测看一个主机安全软件的自我修养