Linux下进程隐藏的方法及其对抗

零、背景



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

一、用户态隐藏



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

1、命令替换


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

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

1070321-20181212184212802-1428315405.png
1070321-20181212184402583-2059635618.png

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

1070321-20181213151446214-1737444387.png

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) 

1070321-20181213151632415-1476748247.png
1070321-20181213151613943-1658744027.png
对抗方法:cat /proc/mount查看挂载情况
1070321-20181213152109045-1298173334.png

三、内核态隐藏:



1、劫持VFS接口层


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

2、劫持系统调用


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

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

  • 查看内核编译时间(uname -a)
  • 查看内核模块(lsmod)
    1070321-20181213160056347-1651782423.png

四、参考文献:



转载于:https://www.cnblogs.com/KevinGeorge/p/10110376.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值