zoukankan      html  css  js  c++  java
  • Linux下进程隐藏的方法及其对抗

    零、背景



    在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响。轻则浪费时间,重则排查不出问题,让黑客逍遥法外。所以这篇博客研究学习如何对抗linux进程隐藏的手段。

    一、用户态隐藏



    这是一类简单的隐藏方法,同时也是相对容易破解的方法。

    1、命令替换


    替换ps、top、ls等命令的文件,破解方法很简单,查看文件修改时间和HASH值,如果与默认时间,或正常命令文件的HASH值不符,则被替换。破解方法,传回来一个正常的文件重新使用命令操作即可

    #查看文件状态
    stat filename
    #计算文件hash值


    2、Hook系统调用


    Hook系统调用
    举例ps

    #ps命令原理:
    (1)调用openat系统函数获取/proc目录的文件句柄
    (2)调用系统函数getdents递归获取/proc目录下所有文件信息(包括子目录)
    (3)调用open函数打开/proc/进程pid/stat和/proc/进程pid/status,以及/proc/进程pid/cmdline文件开始获取进程信息
    (4)然后打印输出

    攻击者可以劫持getdents和libc中的readdir函数(修改内核中的系统调用代码或者修改lib中的函数代码)实现过滤特定进程名,从而实现进程隐藏。
    备注:getdents函数对应的系统调用是sys_getdents(),readdir函数对应的系统调用是proc_pid_readdir(),跟踪系统调用可以:

    apt-get install sysdig
    sysdig proc.name=ps

    3、劫持lib库


    劫持lib库

    原理解析:利用环境变量LD_PRELOAD或者配置ld.so.preload文件使的恶意的动态库先于系统标准库加载,以达到架空系统标准库中相关函数的目的,最终实现对特定进程的隐藏。

    例子参考聊一聊Linux下进程隐藏的常见手法及侦测手段
    方法2和方法3的隐藏只要查看/proc下面找到进程相关信息即可。可以写脚本遍历/proc/pid下面的cmdline

    4、挂载目录到/proc下


    #原理挂载一些空的路径到/proc对应进程号下面,ps等命令在遍历/proc时则没有办法找到该进程的信息。
    # -*- coding:utf-8 -*-
    
    import os
    import time
    
    while True:
        pid = os.getpid()
        print "start!"
        os.system("mount /dev/sda1 /proc/%s"%str(pid))#当然也可以使用mount -o bind /empty/dir /porc/xxxx
        print "end"
        #time.sleep(1) 
    



    对抗方法:cat /proc/mount查看挂载情况

    三、内核态隐藏:



    1、劫持VFS接口层


    proc文件系统也是VFS抽象类的一个具体子类,与其它文件系统不同的是,它是存在与内存中的虚拟文件系统,以文件系统的方式为访问内核数据的操作提供接口。在执行ps或ls命令时,proc文件系统会调用readdir函数依次遍历proc目录下的数字目录,而readdir又会调用filldir函数返回改数字目录对应进程的相关信息,因此,只要在filldir函数中增加适当的过滤,就可以实现对进程的隐藏了。

    2、劫持系统调用


    #如getdents函数对应的系统调用是sys_getdents(),readdir函数对应的系统调用是proc_pid_readdir()

    上面两个方法要么修改内核,要么新增加内核模块(LKM)。修改内核一般需要重启,增加内核模块不需要,所以增加内核模块更隐蔽一些。
    对抗方法:

    • 查看内核编译时间(uname -a)
    • 查看内核模块(lsmod)

    四、参考文献:



  • 相关阅读:
    【转】PostgreSQL中表名、字段名大小写问题
    【转】 PostgreSQL数据类型
    ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库(问题总结)
    mvc项目中实现备份数据库(sqlserver2012)
    定时器的使用
    ASP.NET MVC向前台输出javascript问题
    无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它
    标签控制器  UITabBarController
    UITableView动态存放、重用机制
    UITableView表格视图、UITableView代理方法及应用
  • 原文地址:https://www.cnblogs.com/nul1/p/11474770.html
Copyright © 2011-2022 走看看