当前位置:网站首页 > 黑客培训 > 正文

技术分享 | Linux 入侵检测中的进程创建监控

freebuffreebuf 2019-07-21 294 0

本文来源:wangyiyunyidun

作者简介:张博,网易高级信息安全工程师。

0x00 简介

在入侵检测的过程中,进程创建监控是必不可少的一点,因为攻击者的绝大多数攻击行为都是以进程的方式呈现,所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为。

本文将介绍一些常见的监控进程创建的方式,包括其原理、Demo、使用条件和优缺点。行文仓促,如果有哪些错误和不足,还望大家批评指正。


0x01 常见方式

目前来看,常见的获取进程创建的信息的方式有以下四种:

  • 1、So preload
  • 2、Netlink Connector
  • 3、Audit
  • 4、Syscall hook

下面我们就从原理、Demo、使用条件和优缺点来了解一下这四种方式。


0x02 So preload

原理

首先跟大家介绍两点基础知识:

1.Linux 中大部分的可执行程序是动态链接的,常用的有关进程执行的函数例如 execve均实现在 libc.so 这个动态链接库中。

2.Linux 提供了一个 so preload 的机制,它允许定义优先加载的动态链接库,方便使用者有选择地载入不同动态链接库中的相同函数。

结合上述两点不难得出,我们可以通过 so preload 来覆盖 libc.so 中的 execve等函数来监控进程的创建。

Demo

下面我们就来实现一个简单的 demo 。

1.创建文件 hook.c ,内容如下:

#define _GNU_SOURCE
#include stdio.h>
#include unistd.h>
#include dlfcn.h>

typedef ssize_t (*execve_func_t)(const char* filename, char* const argv[], char* const envp[]);
static execve_func_t old_execve = NULL;

int execve(const char* filename, char* const argv[], char* const envp[]) {
printf("Running hook\n");
printf("Program executed: %s\n", filename);
old_execve = dlsym(RTLD_NEXT, "execve");
return old_execve(filename, argv, envp);
}

该文件的主要部分就是重新定义了 execve函数,在原始的 execve执行之前打印可执行文件的名字。

2.生成动态链接库:gcc hook.c-fPIC-shared-o hook.so

3.将上面生成的动态链接库注册成 preload :echo'/path/to/hook.so'>/etc/ld.so.preload

4.退出当前 shell 并重新登录(下面会讲原因),执行命令即可看到我们编写的代码已被执行:

v2-8387717fac8092383458c9be73bb3f3a_hd.j

使用条件

该方法没有什么条件限制,只需有 root 权限即可(做入侵监控程序 root 权限是必需的,后面的几种方法默认也都是在 root 权限下)。

优缺点

优点

轻量级,只修改库函数代码,不与内核进行交互。

缺点

对于使用方法的第四步,可能大家会有疑问:为什么一定要重新获取 shell 才可以看到效果呢?这是因为其实在当前 shell 下执行命令(也就是执行 execve)的实际上是当前的 shell 可执行程序,例如 bash ,而 bash 所需的动态链接库在其开始运行时就已确定,所以我们后续添加的 preload 并不会影响到当前 bash ,只有在添加 preload 之后创建的进程才会受 preload 的影响。这也就得出了该方法的第一个缺点:

  • 只能影响在 preload 之后创建的进程,这就需要检测 Agent 安装得越早越好,尽量在其他应用进程启动之前就完成安装。

除此之外还有以下几点缺点:

  • 1、无法监控静态链接的程序:目前一些蠕虫木马为了降低对环境的依赖性都是用静态链接,不会加载共享库,这种情况下这种监控方式就失效了。
  • 2、容易被攻击者发现并篡改:目前一些蠕虫木马本身也会向 /etc/ld.so.preload 中写入后门,以方便其对机器的持久掌控,这种情况下这种监控方式也会失效。
  • 3、攻击者可通过 int80h绕过 libc 直接调用系统调用,这种情况下这种监控方式也会失效。


0x03 Netlink Connector

原理

在介绍 Netlink Connector 之前,首先了解一下 Netlink 是什么,Netlink 是一个套接字家族(socket family),它被用于内核与用户态进程以及用户态进程之间的 IPC 通信,我们常用的 ss命令就是通过 Netlink 与内核通信获取的信息。

Netlink Connector 是一种 Netlink ,它的 Netlink 协议号是 NETLINK_CONNECTOR,其代码位于 https://github.com/torvalds/linux/tree/master/drivers/connector 中,其中 connectors.c 和 cnqueue.c 是 Netlink Connector 的实现代码,而 cnproc.c 是一个应用实例,名为进程事件连接器,我们可以通过该连接器来实现对进程创建的监控。

系统架构:

(图片来源:https://www.slideshare.net/kerneltlv/kernel-proc-connector-and-containers

v2-e8c725fc5527e96d147c4980ca42b601_hd.j

具体流程:

(图片来源:https://4hou.win/wordpress/?p=29586

v2-3d170a12a7564a5869410d94c73fa268_hd.j

图中的 ncp 为 Netlink Connector Process,即用户态我们需要开发的程序。

Demo

在 Github 上已有人基于进程事件连接器开发了一个简单的进程监控程序:https://github.com/ggrandes-clones/pmon/blob/master/src/pmon.c ,其核心函数为以下三个:

1、nl_connect:与内核建立连接

2、set_proc_ev_listen:订阅进程事件

3、handle_proc_ev:处理进程事件

其执行流程正如上图所示。

我们通过 gcc pmon.c-o pmon生成可执行程序,然后执行该程序即可看到效果:

v2-3efc0a17be797b91108000acd40ebb7b_hd.j

获取到的 pid 之后,再去 /proc/pid>/目录下获取进程的详细信息即可。

使用条件

内核支持 Netlink Connector

  • 1、版本 > 2.6.14
  • 2、内核配置开启: cat/boot/config-$(uname-r)|egrep'CONFIG_CONNECTOR|CONFIG_PROC_EVENTS'

优缺点

优点

  • 轻量级,在用户态即可获得内核提供的信息。

缺点

  • 仅能获取到 pid ,详细信息需要查 /proc/pid>/,这就存在时间差,可能有数据丢失。


0x04 Audit

原理

Linux Audit 是 Linux 内核中用来进行审计的组件,可监控系统调用和文件访问,具体架构如下(图片来源:https://slack.engineering/syscall-auditing-at-scale-e6a3ca8ac1b8):

v2-9b0872099e8e40cfede251df58207261_hd.j

1.用户通过用户态的管理进程配置规则(例如图中的 go-audit ,也可替换为常用的 auditd ),并通过 Netlink 套接字通知给内核。

2.内核中的 kauditd 通过 Netlink 获取到规则并加载。

3.应用程序在调用系统调用和系统调用返回时都会经过 kauditd ,kauditd 会将这些事件记录下来并通过 Netlink 回传给用户态进程。

4.用户态进程解析事件日志并输出。

Demo

从上面的架构图可知,整个框架分为用户态和内核态两部分,内核空间的 kauditd 是不可变的,用户态的程序是可以定制的,目前最常用的用户态程序就是 auditd ,除此之外知名的 osquery 在底层也是通过与 Audit 交互来获取进程事件的(https://medium.com/palantir/auditing-with-osquery-part-one-introduction-to-the-linux-audit-framework-217967cec406)。下面我们就简单介绍一下如何通过 auditd 来监控进程创建。

首先安装并启动 auditd :

apt update pid>/来补全。
  • 3、Audit :从内核获取数据,监控系统调用,功能多,不只监控进程创建,获取的信息相对全面。
  • 4、Syscall hook :从内核获取数据,监控系统调用,最接近实际系统调用,定制度高,兼容性差。
  • 对我个人来讲,单纯地看监控进程创建这方面,我还是更推荐使用 Netlink Connector 的方式,这种方式在保证从内核获取数据的前提下又足够轻量,方便进行定制化开发。如果是想要进行全方面的监控包括进程、网络和文件,Audit 是一个不错的选择。

    另外本文是以 Demo 的形式对功能进行介绍,主要是想起到一个抛砖引玉的作用,至于各方法的稳定性并没有进行充分地测试,如果各位有这方面的测试数据欢迎在这里和大家分享讨论。

    0x07 参考

    https://4hou.win/wordpress/?p=29586

    https://tech.meituan.com/2019/01/17/distributed-hids-cluster-architecture-design.html

    https://www.ibm.com/developerworks/cn/linux/l-lo-use-space-audit-tool/index.html

    https://linux-audit.com/configuring-and-auditing-linux-systems-with-audit-daemon/

    https://my.oschina.net/macwe/blog/603583

    https://mp.weixin.qq.com/s/ntE5FNM8UaXQFC5l4iKUUw

    https://mp.weixin.qq.com/s?__biz=MzUzODQ0ODkyNA==&mid=2247483854&idx=2&sn=815883b02ab0000956959f78c3f31e2b&scene=21

    https://github.com/draios/sysdig

    https://github.com/falcosecurity/falco




    转载请注明来自网盾网络安全培训,本文标题:《技术分享 | Linux 入侵检测中的进程创建监控》

    标签:linux内容安全

    关于我

    欢迎关注微信公众号

    关于我们

    网络安全培训,黑客培训,渗透培训,ctf,攻防

    标签列表