1.命令替换

实现方法

替换系统中常见的进程查看工具(比如ps、top、lsof)的二进制程序

对抗方法

使用stat命令查看文件状态并且使用md5sum命令查看文件hash,从干净的系统上拷贝这些工具的备份至当前系统,对比hash是否一致,不一致,则说明被替换了。

注:需要在bin目录下执行。

2.Hook系统调用

以ps 工作原理为例说明这些进程信息查看工具的原理

我们知道/proc是一个虚拟文件系统,是VFS的一个实现形式,/proc中包含了内核信息,硬件信息,进程信息等,ps等工具就是通过分析/proc文件系统中进程相关目录的信息获取进程信息汇总。HooK系统调用型的进程隐藏方式都是通过拦截或者迷惑ps等工具从/proc获取分析结果的过程,而不是针对/proc/文件系统生成本身。

ps 首先会调用openat 系统函数获取/proc目录的文件句柄,然后调用系统函数 getdents 递归获取/proc目录下所有文件信息(包括子目录),然后开始open函数打开/proc/进程pid/stat,/proc/进程pid/status/proc/进程pid/cmdline 文件开始获取进程信息,然后打印结果。

原理:
(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个途径:
(1)修改内核调用,比如getdents 的源码
(2)修改libc库中readdir 函数的源码
(3)利用环境变量LD_PRELOAD 或者配置ld.so.preload文件以使得恶意的动态库先于系统标准库加载,以达到架空系统标准库中相关函数的目的,最终实现对特定进程的隐藏。
备注:getdents函数对应的系统调用是sys_getdents(),readdir函数对应的系统调用是proc_pid_readdir(),

对抗方法:

使用sysdig(有开源版,可以监控ps等的调用过程,观察是否有恶意动态库被加载。strace有类似功能)或者prochunter(google 上search)

sysdig proc.name=ps

上述命令可以查看进程的整个启动过程,可以分析是否被劫持。

安装方法

#导入draios源
rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public
curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo #装包
yum -y install kernel-devel* dkms sysdig

安装后如果报错如下:

则需执行:

sudo sysdig-probe-loader

3.利用mount命令进行挂载

这个几乎是最常用的实现方式,利用mount命令将磁盘挂在到proc文件夹下的特定位置即可隐藏进程。

我们知道ps、top等工具会读取/proc目录下获取进程信息,如果将进程ID的目录信息覆盖,则原来的进程信息将从ps的输出结果中隐匿。

实现方法

  1. 查看进程
    我们先使用ps查看python进程,这时候发现有一个pid为5400的python3的进程。
  2. 挂载磁盘到指定位置
    我们根据ps的原理可知,ps查询的是proc文件夹下的内容,我么直接将磁盘挂在到proc文件夹下的5400即可实现对5400进程的隐藏。
    首先使用df命令查看磁盘:

    接着使用mount命令挂载/dev/vda2到/proc/5400:
    mount /dev/vda2 /proc/5400

    此时我们在用ps命令查看,发现5400进程已经消失了,达到了隐藏的效果:

对抗方法

使用cat /proc/$$/mountinfo 或者cat /proc/mounts 查看是否有利用mount -bind 将其它目录或文件挂载至/proc下的进程目录的情况,如下图所示,选中部分即为挂载情况:

使用umount /dev/vda2 /proc/5400即可恢复原状取消挂载。

参考资料

https://www.anquanke.com/post/id/160843

https://bbs.huaweicloud.com/blogs/209771

最新文章

  1. coocs2d-x 分辨率
  2. EXTJS中grid的数据特殊显示,不同窗口的数据传递
  3. TJpgDec—轻量级JPEG解码器
  4. Master-Slave通用基础框架
  5. C#网络编程之---TCP协议的同步通信(二)
  6. Solr6.2.0 + zookeeper 集群配置
  7. I/O多路复用 SELECT POLL -- 内核实现
  8. Python--Cmd窗口运行Python时提示Fatal Python error: Py_Initialize: can't initialize sys standard streams LookupError: unknown encoding: cp65001
  9. NSString的八条实用技巧
  10. 重学STM32----(二)
  11. Delphi Refactor 重构
  12. insmod: error inserting 'simp-blkdev.ko': -1 Invalid module format
  13. 基于UDP协议的控制台聊天
  14. Python 读取csv文件到excel
  15. 使用Web Application Stress Tool 进行压力测试
  16. c#代码启动任务管理器的几种方法
  17. mysql的学习笔记(七)
  18. Kali安装Docker
  19. PythonStudy——函数的返回值 The return value of the function
  20. python成长之路五-文件操作

热门文章

  1. hdu5135 Little Zu Chongzhi's Triangles
  2. Complete the sequence! POJ - 1398 差分方法找数列规律
  3. 【Java】位操作符
  4. MySQL 企业案例:误删核心业务表
  5. anaconda + pyqt5 + pycharm 安装,测试
  6. Gym 101170F Free Weights(二分)题解
  7. git操作是出现Username for 'https://github.com':的验证问题
  8. nodejs非安装版配置(windows)
  9. 利用设置新数据存储结构解决vue中折叠面板双向绑定index引起的问题
  10. μC/OS-III---I笔记12---任务管理