安全应急响应 | 如何从内核中直接获取隐藏的进程信息 – 作者:ForrestX386

*本文作者:ForrestX386,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

 一、引言

在安全应急响应中,查看系统进程信息是必不可少的一个环节,从进程信息中可以发现异常进程,从而为定位问题系统帮助。但攻击者也不是傻子,他也知道,不隐藏自身,肯定会很快被发现,于是就衍生了很多进程隐藏技巧,比如利用mout –bind 重新挂载/proc/(详见:http://www.freebuf.com/network/140535.html),恶意动态库劫持过滤指定进程信息,Hook proc_pid_readdir函数以及proc_pid_lookup函数使得指定进程不会出现在proc文件系统生成等。

为了能够找到这些被隐藏的异常进程,本文介绍一个方法,直接从内核模块中获取最原始的进程信息,从而使得上述隐藏技巧失效,进而找到异常进程信息,详文如下。

二、先来了解一下内核中task_struct结构体信息

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体.

task_struct是Linux内核的一种数据结构,它会被装载到RAM中并且包含着进程的信息。每个进程都把它的信息放在 task_struct 这个数据结构体,task_struct 包含了这些内容:

(1)标示符 : 描述本进程的唯一标识符,用来区别其他进程。

(2)状态 :任务状态,退出代码,退出信号等。

(3)优先级 :相对于其他进程的优先级。 

 (4)程序计数器:程序中即将被执行的下一条指令的地址。 

 (5)内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。 

(6)上下文数据:进程执行时处理器的寄存器中的数据。

(7) I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。  

(8) 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等

……

因task_struct 内容很复杂,也很多,不是本文论述重点,更多详情请参考:https://blog.csdn.net/qq_29503203/article/details/54618275

我们感兴趣的有:

进程pid:  task_struct->pid

父进程pid:  task_struct->parent->pid

进程名称:  task_struct->comm

进程执行时间: task_struct->start_time->tv_sec 

进程优先级:task_struct->rt_priority 

进程状态:task_struct->state

通过内核函数for_each_process遍历所有进程,可以获取每个进程的task_struct中我们感兴趣的成员变量,于是我们可以编写一个简单点的内核模块,获取这些信息,然后打印到/var/log/message中,详见0x03

三、手动编写一个简单的内核模块获取隐藏进程信息

编写一个简单的内核模块,代码可简单分为5部分

1)导入必要的库文件,必须有

2)init_module 函数 ,insmod 加载内核模块时执行,在其中调用5),必须有

3)cleanup_module 函数, rmmod 卸载内核模块时执行,必须有

4)真正工作的函数,必须有

5)版权信息,可选

注: 2)和3)中

可以通过

module_init( my_module_init );

module_exit( my_module_cleanup );

设置装载LKM和卸载LKM时候的执行的函数(默认是init_module 和cleanup_module )

真正工作的函数代码如下:

如何从内核中直接获取隐藏的进程信息

Makefile代码如下:

如何从内核中直接获取隐藏的进程信息

编译:

make

如何从内核中直接获取隐藏的进程信息

insmod get_hide_process.ko即可载入内核(重启失效)

编译测试环境:

如何从内核中直接获取隐藏的进程信息

四、实验测试

1)隐藏进程

先在一个窗口内开启ping进程,然后利用技术手段使其隐藏:

如何从内核中直接获取隐藏的进程信息

2)找出隐藏进程

加载0x03中的内核模块

insmod get_hide_process.ko

然后查看/var/log/message

如何从内核中直接获取隐藏的进程信息

找到隐藏的ping进程,这种查找进程信息的方式不依赖于proc系统,直接从内核中获取,比较准确!

五、总结

在安全应急响应中,在其他方法无法获取帮助的情况下,可以尝试本文介绍的这个内核模块小工具,不过本文实验中的模块所获取的信息内容还不够完善,大家有兴趣的可以补充一下,比如获取类似/proc/xx/cmdline 的内容,进程打开的文件信息等(实现同lsof -p xxx的效果)。后续还可以将其包装成一个用户空间的工具,不用手动装载、卸载内核模块,这样使用起来更加方便。本次实验中关键代码都已给出,一些无关紧要的代码,google search 便知,大家可以动手实验一下。

*本文作者:ForrestX386,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

来源:freebuf.com 2018-10-23 08:30:37 by: ForrestX386

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论