标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2024-2743] 作者: ecawen 发表于: [2020-09-01]
本文共 [438] 位读者顶过
零、背景在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响。轻则浪费时间,重则排查不出问题,让黑客逍遥法外。所以这篇博客研究学习如何对抗linux进程隐藏的手段。 一、用户态隐藏这是一类简单的隐藏方法,同时也是相对容易破解的方法。 1、命令替换替换ps、top、ls等命令的文件,破解方法很简单,查看文件修改时间和HASH值,如果与默认时间,或正常命令文件的HASH值不符,则被替换。破解方法,传回来一个正常的文件重新使用命令操作即可 #查看文件状态 stat filename #计算文件hash值
[出自:jiwo.org] 2、Hook系统调用
Hook系统调用 #ps命令原理: (1)调用openat系统函数获取/proc目录的文件句柄
(2)调用系统函数getdents递归获取/proc目录下所有文件信息(包括子目录)
(3)调用open函数打开/proc/进程pid/stat和/proc/进程pid/status,以及/proc/进程pid/cmdline文件开始获取进程信息
(4)然后打印输出
攻击者可以劫持getdents和libc中的readdir函数(修改内核中的系统调用代码或者修改lib中的函数代码)实现过滤特定进程名,从而实现进程隐藏。 apt-get install sysdig
sysdig proc.name=ps
3、劫持lib库劫持lib库 原理解析:利用环境变量LD_PRELOAD或者配置ld.so.preload文件使的恶意的动态库先于系统标准库加载,以达到架空系统标准库中相关函数的目的,最终实现对特定进程的隐藏。
例子参考聊一聊Linux下进程隐藏的常见手法及侦测手段 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)
三、内核态隐藏:1、劫持VFS接口层proc文件系统也是VFS抽象类的一个具体子类,与其它文件系统不同的是,它是存在与内存中的虚拟文件系统,以文件系统的方式为访问内核数据的操作提供接口。在执行ps或ls命令时,proc文件系统会调用readdir函数依次遍历proc目录下的数字目录,而readdir又会调用filldir函数返回改数字目录对应进程的相关信息,因此,只要在filldir函数中增加适当的过滤,就可以实现对进程的隐藏了。
2、劫持系统调用#如getdents函数对应的系统调用是sys_getdents(),readdir函数对应的系统调用是proc_pid_readdir()
上面两个方法要么修改内核,要么新增加内核模块(LKM)。修改内核一般需要重启,增加内核模块不需要,所以增加内核模块更隐蔽一些。
四、参考文献: |