哈勃沙箱技术总览
前言
在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程。本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volatility。volatility的介绍不会太深入,内存取证这部分的研究还需要继续。
第一节
strace机制
上一篇讲到了strace和ltrace都是基于ptrace机制,但是对ptrace机制和strace/ltrace是如何利用ptrace监控系统调用,没有进行详细的讲解。
那什么是ptrace机制呢?
ptrace机制是操作系统提供了一种标准的服务来让程序员实现对底层硬件和服务的控制。
当一个程序需要作系统调用的时候,它将相关参数放进系统调用相关的寄存器,然后调用软中断0x80,这个中断就像一个让程序得以接触到内核模式的窗口,程序将参数和系统调用号交给内核,内核来完成系统调用的执行。
ptrace会在什么时候出现呢?
在执行系统调用之前,内核会先检查当前进程是否处于被“跟踪”(traced)的状态。如果是的话,内核暂停当前进程并将控制权交给跟踪进程,使跟踪进程得以察看或者修改被跟踪进程的寄存器。
strace监控系统调用
下面就以strace为例,如下图所示,在第2步和第3步是关键。
strace使用ptrace机制来检测目标进程并“监听”该进程的系统调用,strace可以在每次调用系统调用时中断跟踪的进程,捕获调用,解码它,然后继续执行跟踪的进程。
大家可能知道,每次调用系统调用(例如,打开,读取,写入,关闭)时,都需要从用户级别到内核级别的转换 - 这称为上下文切换。这取决于CPU系列和型号,以不同的方式实现,但它往往复杂且相对较慢。
第二节
sysdig机制
sysdig是一个开源系统发掘工具,用于系统级别的勘察和排障,可以看作system(系统)+dig(挖掘)的组合。我们可以把它看作一系列传统的 unix 系统工具的组合,主要包括:
sysdig工作方式分成用户空间和内核空间两个部分,结构如下图所示(附件画图画的
):
数据的捕获流程分为如下5部分:
从整体架构上来看,sysdig与libpcap / tcpdump / wireshark的架构非常相似,都是先捕获大量的数据,然后使用过滤器获取自己想要的数据。
希望大家注意到一个问题, sysdig-probe从内核捕获的数据会非常大的,用户空间里的scap,sinsp,sysdig组件能处理过来吗?假如处理不过来,sysdig会采用什么机制呢?sysdig会像strace一样放慢程序速度吗?
答案是否定的。在这种情况下,事件缓冲区填满,sysdig-probe开始丢弃传入的事件。因此,将丢失一些跟踪信息,但机器上运行的其他进程不会减慢速度,这是sysdig架构的关键优势,意味着跟踪开销可预测。既然sysdig这么强大,下面讲解一下sysdig的基本用法。
sysdig 基本用法
我以ubuntu系统中的操作为例,直接在shell输入sudo sysdig 就能开始捕获系统信息,执行后你会看到终端有持续不断的输出流。
$ sudo sysdig
因为系统每时每刻都有大量的系统调用产生,这样是没办法看清更无法分析输出信息的,可以先使用 ctrl + c 来退出命令。输出如下图所示:
先来解释一下它的输出格式:
1171016:59:32.4209333330gnome-terminal-(2882)<poll res=1fds=5:e1
1171116:59:32.4209344660gnome-terminal- (2882) > recvmsg fd=4(<u>)
1171216:59:32.4209348780gnome-terminal- (2882) < recvmsg res=-11(EAGAIN) size=4096data= tuple=NULL
1171316:59:32.4209358350gnome-terminal- (2882) > poll fds=4:u15:e110:u113:f1 timeout=9
1171416:59:32.4209367250gnome-terminal- (2882) < poll res=1fds=5:e1
1171516:59:32.4209371600gnome-terminal- (2882) > read fd=5(<e>) size=16
1171616:59:32.4209375320gnome-terminal- (2882) < read res=8data=........
1171716:59:32.4209385910gnome-terminal- (2882) > recvmsg fd=4(<u>)
1171816:59:32.4209390160gnome-terminal- (2882) < recvmsg res=-11(EAGAIN) size=4096data= tuple=NULL
1171916:59:32.4209399830gnome-terminal- (2882) > poll fds=4:u15:e110:u113:f1 timeout=9
1172016:59:32.4209416090gnome-terminal- (2882) >switchnext=8900(sysdig) pgft_maj=18pgft_min=11155vm_size=619456vm_rss=46160vm_swap=0
1172216:59:32.4209436690sysdig (8900) >switchnext=8726pgft_maj=0pgft_min=1244vm_size=134852vm_rss=11984vm_swap=0
1172316:59:32.4209452150<NA> (8726) >switchnext=8900(sysdig) pgft_maj=0pgft_min=0vm_size=0vm_rss=0vm_swap=0
1172716:59:32.4209716190sysdig (8900) >switchnext=8726pgft_maj=0pgft_min=1244vm_size=134852vm_rss=11984vm_swap=0
1172816:59:32.4209739560<NA> (8726) >switchnext=2882(gnome-terminal-) pgft_maj=0pgft_min=0vm_size=0vm_rss=0vm_swap=0
所有的输入都是按照行来分割的,每行都是一条记录,由多个列组成,默认的格式是:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
各个字段的含义如下:
过滤
完整的 sysdig 使用方法:
sysdig [option]... [filter]
sysdig 的过滤功能很强大,不仅支持的过滤项很多,而且还能够自由地进行逻辑组合。
过滤项
sysdig 的过滤器也是分成不同类别的,比如:
完整的过滤器列表可以使用sysdig -l来查看,比如可以查看建立 TCP 连接的事件:
sudo sysdig evt.type=accept
过滤器组合
过滤器除了直接的相等比较之外,还有其他操作符,包括=、!=、>=、>、<、<=、contains、in 和 exists,
比如:
$ sysdig fd.name contains /etc
$ sysdig "evt.type in ( 'select', 'poll' )"
$ sysdig proc.name exists
多个过滤条件还可以通过 and、or 和 not 进行逻辑组合,比如:
$ sysdig "not (fd.name contains /proc or fd.name contains /dev)"
第三节
volatility简单描述
到这发现已经写了4千多字,volatility这里简要描述一下,详细的分析,等我之后对内存取证有了一个整体的框架再说。
Volatility是一个Python编写的跨平台,用于内存分析的法证工具,其目的是为了在数据犯罪中提取易失性数据 ,也可以用来进行Rootkit的检测和协助清除。Volatility分析主要依赖的是profile文件,profile文件是由两部分合成。以linux为例,大致如下:
参考:
http://drops.xmd5.com/static/drops/papers-2854.html https://sysdig.com/blog/sysdig-vs-dtrace-vs-strace-a-technical-discussion/ https://cizixs.com/2017/04/27/sysdig-for-linux-system-monitor-and-analysis/ https://blog.csdn.net/edonlii/article/details/8717029