linux进程隐藏与对抗
前言
这篇文章主要做一个技术点的记录,过去接触比较少,现在对其进行一个小结。
实现方法
1.命令替换
实现方法
替换top、ps等命令
对抗方法
使用stat命令查看文件状态并且使用md5sum命令查看文件hash并将其与正常文件hash进行比较。如果确定被替换,使用正常文件替代坏文件即可。
2.Hook系统调用
比如说ps这个命令:
原理:
(1)调用openat系统函数获取/proc目录的文件句柄
(2)调用系统函数getdents递归获取/proc目录下所有文件信息(包括子目录)
(3)调用open函数打开/proc/进程pid/stat和/proc/进程pid/status,以及/proc/进程pid/cmdline文件开始获取进程信息
(4)然后打印输出
攻击者可以劫持getdents和libc中的readdir函数(修改内核中的系统调用代码或者修改lib中的函数代码)实现过滤特定进程名,从而实现进程隐藏。
实现方法:
劫持getdents 等系统调用函数或libc中的readdir 函数等系统调用函数一般来说有3个途径
I、修改内核调用,比如getdents 的源码
II、修改libc库中readdir 函数的源码
III、利用环境变量LD_PRELOAD 或者配置ld.so.preload文件 以使的恶意的动态库先于系统标准库加载,以达到架空系统标准库中相关函数的目的,最终实现对特定进程的隐藏
备注:getdents函数对应的系统调用是sys_getdents(),readdir函数对应的系统调用是proc_pid_readdir(),
对抗方法:
跟踪系统调用可以使用sysdig这个程序:
sysdig proc.name=ps
上述命令可以查看进程的整个启动过程,可以分析是否被劫持。
3.利用mount命令进行挂载
这个几乎是最常用的实现方式,利用mount命令将磁盘挂在到proc文件夹下的特定位置即可隐藏进程:
实现方法
- 查看进程
我们先使用ps查看python进程,这时候发现有一个pid为1906的python3的进程。 - 挂载磁盘到指定位置
我们根据ps的原理可知,ps查询的是proc文件夹下的内容,我么直接将磁盘挂在到proc文件夹下的1906即可实现对1906进程的隐藏。
首先使用df
命令查看磁盘:
接着使用mount命令挂载/dev/sda1到/proc/1906:mount /dev/sda1 /proc/1906
此时我们在用ps命令查看,发现1906进程已经消失了,达到了隐藏的效果:
对抗方法
使用cat /proc/mounts查看,看是否有被挂载的磁盘,如下图所示,选中部分即为挂载情况:
使用umount /dev/sda1 /proc/1906即可恢复原状取消挂载。