0x00.前言

进程隐藏是恶意软件隐藏自身痕迹逃避系统管理人员发现的常用伎俩之一,当然,安全防护人员有时候也会使用到,比如隐藏蜜罐中的监控进程而不被入侵者觉察等。笔者也曾在多次安全应急响应经历中遇到过多各式各样的进程隐藏伎俩,了解进程隐藏的常见手法及发现手段是每一位安全运维工程师所应掌握的知识点。本文抛砖引玉,浅谈我所了解的Linux下进程隐藏手段及发现技巧,也希望读者能够积极分享自己相关经验与技巧。

0x01.我所了解的 Linux下进程隐藏手段及侦测方法

Linux 下进程隐藏手法大体上分为两种,一种是基于用户态隐藏;一种是直接操控内核进行隐藏。

一、基于用户空间进程隐藏手法

1、偷梁换柱型

1)隐藏原理

​ 道理很简单,通过替换系统中常见的进程查看工具(比如ps、top、lsof)的二进制程序,导致原先查看进程相关信息的工具(ps、top、lsof等)都被调包了,当然看不到

2)防护手段

​ I、从干净的系统上拷贝这些工具的备份至当前系统,对比前后的输出是否一致,不一致,则说明被替换了

​ II、检测这些工具的hash值是否与系统初始化的时候值不一致,是,则说明被替换了

​ III、专业一点话,使用一些系统完整性检查工具,比如tripwrie、aide等

​ IV、部署主机入侵检查工具(比如ossec),监控系统文件是否被替换,如有替换,则会报警记录

2、HooK系统调用型

1)隐藏原理

先说下ps、top等工具的工作原理

以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 文件开始获取进程信息,然后打印给你看

攻击者通过劫持getdents 等系统调用函数或libc中的readdir 函数,实现对特定进程名进程的隐藏,以达到进程隐藏目的

劫持getdents 等系统调用函数或libc中的readdir 函数等系统调用函数一般来说有3个途径

I、修改内核调用,比如getdents 的源码

II、修改libc库中readdir 函数的源码

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

这3个原理类似,III相对于I、II比较简单,在此以III为例进行演示(劫持libc 中的readdir函数)

演示(利用LD_PRELOAD这个环境变量进行进程信息隐藏),比如隐藏ping这个进程:

先在一个窗口执行ping

在另外一个窗口加载恶意动态库,动态库源码中对指定进程信息进程了过滤

上文也提到这种HooK系统调用函数的进程隐藏方式只是hook了ps等工具从/proc 获取信息的过程,而没有修改/proc/文件系统本身,其实相关进程信息的内核映射还在/proc中

自己写个python小工具,直接读取/proc中的内容,也能发现异常

其实ls 也是调用libc中的readdir函数,如果对上述恶意动态库进行修该也可以实现对ls命令的劫持。不过对于直接使用cat读取文件(linux下什么东东都是文件)内容获取进程信息的方式,劫持libc的readdir函数是没用的,因为cat调用的是一系列lookup函数(需要对这一系列函数进行劫持,原理类似)

2)防护手段

I、检查LD_PRELOAD环境变量是否有异常

II、检查ld.so.preload 等配置文件是否有异常

III、自己写个python小工具,直接读取/proc中的内容,对于ps等工具的结果,对不上,则存在被劫持可能

IV、使用sysdig(有开源版,可以监控ps等的调用过程,观察是否有恶意动态库被加载。strace有类似功能)或者prochunter(google 上search)

​ sysdig proc.name=ps

3、伪造进程名型

1) 隐藏原理

在恶意代码中通过设置具有迷惑性的进程名字,以达到躲避管理员检查的目的

比如 Tiny Shell文章 中介绍的Tiny shell 这款工具通过在源码中设置PROCESS_NAME为bash,以使得其运行后的进程名显示为bash

另:也可利用bash的特性来更换进程的名字

exec -a 更换后的进程名 原来的执行命令

比如exec -a sysdig proc.name=ps &执行之后,进程名显示为bash proc.name=ps

如果原来的执行命令没有参数,则非常具有迷惑性

2)防护手段

找到可疑进程所在的/proc目录,查看exe的指向

可疑发现真正的进程是sysdig 触发的

4、挂载覆盖型

1)隐藏原理

利用mount —bind 将另外一个目录挂载覆盖至/proc/目录下指定进程ID的目录,我们知道ps、top等工具会读取/proc目录下获取进程信息,如果将进程ID的目录信息覆盖,则原来的进程信息将从ps的输出结果中隐匿。

比如进程id为42的进程信息:mount -o bind /empty/dir /proc/42

案例:http://www.freebuf.com/articles/network/140535.html

2)防护手段

cat /proc/$$/mountinfo 或者cat /proc/mounts 查看是否有利用mount —bind 将其他目录或文件挂载至/proc下的进程目录的

二、基于对内核空间修改进行进程信息隐藏的手法

这一类的手法就比较高深了,基本上都算作rootkit了

1、劫持VFS文件系统系列函数实现对/proc动态生成结果的干扰,从而实现对某些进程的隐藏。

我们知道/proc这个内存文件系统是VFS的一个实现,如果在VFS接口层就进行进程过滤的话,我们在/proc目录下根本找不到相关进程的目录信息,更别谈ps 之类工具可以获取了。VFS层中涉及到proc动态生成结果的有inode_operation 和 file_operations等系列函数集,通过劫持这些函数集,可以使得进程信息无法通过文件系统接口输出给proc

2、劫持进程创建模块代码,根据条件设置选择是否隐藏进程

案例:CRUX下实现进程隐藏(1) - Hiroki - 博客园

大致的意思就是在Linux进程管理之task_struct结构体增加进程隐藏与否标记

进程创建代码模块中根据设置的进程隐藏比较选择是否隐藏进程,如果为隐藏标记,则删除/proc文件系统中该进程的相关目录项,直接在内核中就把指定进程给过滤了,用户态根本查不到

对于1)和2)这两种场景比较棘手,防护手段如下

I、查下内核是否被重新编译替换

II、lsmod是否有新内核模块加入

III、查看机入侵检查系统的相关告警

0x02. 总结

Linux下进程隐藏的手法不会仅限于本文提到的这些,本文提到也只是冰山一角,浅谈而已。笔者希望此文能引起更多人的关注与讨论,希望各位大牛多多分享自己的经验与奇淫技巧。笔者水平有限,文中定有不足之处,还望各位斧正。

0x03. 参考

GitHub - hschen0712/process-hiding: linux下实现进程隐藏

http://tcspecial.iteye.com/blog/2361998

Linux进程隐藏的一种实现思路_TechWeb

https://www.jb51.net/LINUXjishu/347787.html

linux下根据进程名称隐藏进程的PID-jl2012_1228-ChinaUnix博客

http://www.voidcn.com/article/p-yfrjbuvq-pz.html

linux - How to hide a specific process? - Unix & Linux Stack Exchange

linux - How to Hide/Change name Processes called in Bash Script from ps - Stack Overflow

http://phrack.org/issues/63/18.html

【转】Linux下进程隐藏的常见手法及侦测手段相关推荐

  1. Linux下进程隐藏的常见手法及侦测手段

    痕迹清理 1.  退出前 history -c 2.  多使用sftp吧 0.0 3.  web日志删除一些 4.  用户目录下很多 history,一言不合就是删 :) 4.  btmp wtmp ...

  2. linux进程状态d状态,Linux下进程的状态

    如下信息来自于命令man ps Here are the different values that the s, stat and state output specifiers (header & ...

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

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

  4. linux 让暂停的进程恢复,Linux 下进程的挂起和恢复命令

    本文给大家介绍进程的挂起及恢复命令,具体内容如下所示: #ctrl+z:挂起,程序放到后台,程序没有结束. #jobs:查看被挂起的程序工作号 恢复进程执行时,有两种选择:fg命令将挂起的作业放回到前 ...

  5. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  6. linux看不到进程管理,关于Linux下进程的详解【进程查看与管理】

    关于Linux下进程的详解[进程查看与管理] 一.关于进程 进程: 已经启动的可执行程序的运行实力 进程的组成:一个进程包含内核中的一部分地址空间和一系列数据结构.其中地址空间是内核标记的一部分内存以 ...

  7. linux剪切到另一个文件夹,linux下文件夹操作常见命令如创建、复制、剪切、重命名、清空和删除命令 实例说明...

    linux下文件夹操作常见命令如创建.复制.剪切.重命名.清空和删除命令 实例说明,在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinoz ...

  8. linux下的进程创建,Linux下进程的创建

    这篇文章主要是讲解到Linux进程的控制,包括程序和进程.守护进程.守护进程的出错处理. 1.程序和进程 程序(program)是存放在磁盘文件中的可执行文件,程序的执行实例被称为进程(process ...

  9. 【Linux、进程隐藏】在Linux环境下添加系统调用实现进程隐藏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [进程隐藏]在Linux环境下添加系统调用实现进程隐藏 前言 一.环境设置: 二.实现方法步骤: 1.思路图 2.利用strace命令 ...

  10. linux下进程监控6,Linux进程监控技术—精通软件性能测试与LoadRunner最佳实战(6)...

    8.2.5  Linux操作系统进程监控技术 Linux在进程监控方面同样出色,不仅可以通过图形用户界面的管理工具,还可以用命令方式显示进程相关信息.像"Windows的任务管理器" ...

最新文章

  1. python 源码解析
  2. 老师吴恩达,身家又增20亿!
  3. 如何去掉 从网页上copy到word文档中之后 的背景颜色 (备忘)
  4. golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的
  5. CSS3学习笔记——伪类hover
  6. PCB制作仿真、自制51板测试及性能改进
  7. 我写了款依赖检查的插件
  8. 公交线路查询接口使用说明
  9. Nginx代理百度地图离线瓦片
  10. 如何设置正确的dns服务器地址,dns服务器地址如何设置
  11. 用前端框架开发一款APP要多少钱
  12. 大咖说开源|郑振宇:通过开源手段巩固基础软件供应链
  13. 电脑上的PDF文件太大了怎么办?
  14. 美团和支付宝,越来越像
  15. BufferedStream
  16. 和平精英分数计算机制,和平精英加分机制怎么算 加分玩法详解
  17. 污水处理问题多,泵站自动化控制系统是这样解决的
  18. h5 苹果IOS端 播放mp3 没声音
  19. 数据仓库DW、ODS、DM及其区别
  20. 建议收藏 | 数据化、信息化、数字化、智能化到底都是指什么?彼此有什么联系?

热门文章

  1. C语言计算排列组合C(m,n)的值
  2. ffmpeg编程查看视频文件信息
  3. GitHub 下dist和src,dest目录的区别
  4. 《麻省理工学院公开课:人工智能》笔记三
  5. ARM嵌入式的位绑定原理
  6. 解密QQ旋风和迅雷以及快车链接地址
  7. Excel表格转换为Word表格,并且保留Excel表格中公式不发生变化
  8. 在php内乱码如何动态的进行解决掉
  9. 怎么简单快速一个钟头入侵网站
  10. 小米 root 国际版 Xposed 刷机