zoukankan      html  css  js  c++  java
  • linux进程隐藏手段及对抗方法

    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

  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/goodhacker/p/14488239.html
Copyright © 2011-2022 走看看