渗透测试之Linux进程隐藏

发布于 2023-11-16  793 次阅读


AI 摘要

这篇文章主要介绍了渗透测试中的权限维持和隐藏进程、隐藏文件的方法。在Linux服务器上获取root用户权限后,可以通过挂载覆盖/proc/pid目录来隐藏进程,使其在ps和top命令的输出结果中消失。同时,可以利用LD_PRELOAD环境变量劫持系统函数,通过自定义动态链接库来控制不显示指定进程名,从而隐藏进程的存在。文章提供了一个可以实现这一功能的源码库,并给出了具体的编译和使用步骤。然而,这种方法的缺点是在/proc目录下仍然存在进程的pid目录,可能被发现。

渗透测试请在取得授权的情况下进行,否则后果自负

对于Linux而言,一旦获取到了shell,基本上这台服务器的大部分信息就能获得;当这个shell是root用户的,那么,这台服务器基本上就已经拿下。

在渗透测试中,权限维持是很重要的一环。拿下一台机器后,无论是搜集信息,还是作为跳板,都需要长久的获取这台机器的权限

想方设法隐藏留下的后门,晚一点被发现,就多获得一点的信息

所以我们得目的也就很简单,隐藏进程和隐藏文件

挂载覆盖/proc/pid 目录

利用 mount -bind 将另外一个目录挂载覆盖至 /proc/目录下指定进程 PID 的目录

ps、top 等命令会读取 /proc 目录下获取进程信息,如果将进程 PID 的目录信息覆盖,则原来的进程信息会从 ps 的输出结果消失。

mount -o bind /root/hid /proc/1234
# 挂载空目录
mount /dev/sda1 /proc/1234
# 挂载磁盘
在ps列表中可以看到python3存在

当当成功挂载后,这个进程就会从 pstop 的列表中消失

挂载后pid 2621消失了

但是,这依旧可以通过遍历 /proc 目录发现进程,也可通过执行 cat /proc/mounts 找到挂载点,并且有些Linux的/proc目录禁止挂载文件

/proc 目录依旧存在

LD_PRELOAD劫持系统函数

LD_PRELOAD是什么:

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。

程序的源码可以从https://github.com/gianlucaborello/libprocesshider下载

git clone https://github.com/gianlucaborello/libprocesshider.git
# 克隆代码
# 修改libprocesshider.c,写上需要hock的进程名

cd libprocesshider
# 进入目录
make
gcc -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl
# 编译

修改要隐藏的进程

最后会生成 libprocesshider.so 文件

mv libprocesshider.so /usr/local/lib/
# 移动到库
echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
# 写入预加载库文件
python3 消失了

原理:

  1. 程序定义了一个变量 process_to_filter 来控制不显示哪个进程名
  2. 重写readdir strcmp(process_name, process_to_filter) == 0)
  3. 当发现当前进程名称与 process_to_filter 相同时,输出 NULL
  4. 继续循环

缺点:/proc 目录下还是会存在我们进程的 pid 目录