*本文作者: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 原创奖励计划,未经许可禁止转载。