零、背景



在应急响应中,经常碰到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)

四、参考文献:



Linux下进程隐藏的方法及其对抗的更多相关文章

  1. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  2. 在Linux下禁用IPv6的方法小结

    在Linux下禁用IPv6的方法小结--http://www.jb51.net/LINUXjishu/335724.html 这篇文章主要介绍了在Linux下禁用IPv6的方法小结,禁用IPv6的操作 ...

  3. linux 下进程通讯详解

    linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket

  4. [转]❲阮一峰❳Linux 守护进程的启动方法

    ❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...

  5. linux下定时执行任务方法【转】

     之前就转过一篇关于定时任务的文章,前俩天用,还的翻出来看!!!再转一次,备用,,需要的时候不用麻烦找! ----------------------------------------------- ...

  6. linux下进程的最大线程数、进程最大数、进程打开的文件数

    linux下进程的最大线程数.进程最大数.进程打开的文件数   ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...

  7. 【Linux】Linux下进程间的通信方式

    本文内容: 1.进程通信的目的 2.介绍Linux下进程间的4种通信方式:管道,消息队列,共享内存,信号量 ps:套接字也可以用于进程间的通信,不过是不同物理机器上的进程通信,本章讨论是是同一台物理机 ...

  8. 【Linux下进程机制】从一道面试题谈linux下fork的运行机制

    今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #include "stdio.h" #includ ...

  9. Linux下进程的建立

    Linux下进程的建立 我们都知道,进程就是正在执行的程序.而在Linux中,可以使用一个进程来创建另外一个进程.这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使 ...

随机推荐

  1. thinkphp中的AJAX返回ajaxReturn()

    系统支持任何的AJAX类库,Action类提供了ajaxReturn方法用于AJAX调用后返回数据给客户端.并且支持JSON.XML和EVAL三种方式给客户端接受数据,通过配置DEFAULT_AJAX ...

  2. 关于Struts2的文件上传

    要实现Struts2框架的文件上传,需要用到2个jar包 commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 由于文件解析Struts2内部已经帮我们做 ...

  3. fopen flock fclose 文件用法

    fopen函数是用来打开文件或者连接 若成功,则返回 true.若失败,则返回 false. fopen打开连接是不能直接输出的 使用: <?php $file = fopen("te ...

  4. Capability Model

    Data Scientist, Analytics We’re looking for data scientists to work on our core and business product ...

  5. 基于maven使用IDEA创建多模块项目

    原文地址:http://blog.csdn.net/williamhappy/article/details/54376855 鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDE ...

  6. 11gR2 RAC:更换OCR、votedisk

    要点: ocrconfig 备份-恢复 ocrconfig 导出-导入 crsctl querry css votedisk crsctl replace votedisk {+dsikgroup|s ...

  7. 将Unity导出的Eclipse工程转换为AndroidStudio工程

    步骤:1)将unity项目导出到文件夹: 转换到安卓平台,这里只勾选google android project.然后导出到自己新建的文件夹. 2)打开导出的文件夹,看到如下内容.这是unity5.x ...

  8. phpcms v9不限模型全站搜索

    简单修改一下v9默认的搜索功能,可以不按模型搜索全站内容 下面是被修改后的search模块中的index.php文件 <?php defined('IN_PHPCMS') or exit('No ...

  9. ASP.NET 动态创建文本框 TextBox (add TextBox to page dynamically)

    下面的函数每执行一次就生成一个TextBox(其实是<input type="Text">)    var i=0;     function changeIt()   ...

  10. 使用npm国内镜像

    嫌npm指令速度慢的童鞋可以把npm的源转换成国内的即可提高响应速度: 镜像使用方法(三种办法任意一种都能解决问题,建议使用第1或者第3种,将配置写死,下次用的时候配置还在):1.通过config命令 ...