长亭百川云 - 文章详情

Linux隐藏恶意进程

同程旅行安全应急响应中心

159

2024-07-13

你知道黑客如何隐藏自己吗?

在实际攻击场景中,攻击者获取到了服务器的权限时通常会想办法躲避安全人员的检测来进行持久化控制。而其中各种匪夷所思隐藏进程的手法一直备受各路攻击者们青睐,也是安全人员检测和监控的难点。本文就针对Linux系统下常见的进程隐藏的手法进行和其检测监控思路进行梳理。

01

修改进程argv[0]/argv[]

1.方法介绍和实现:

原理:

1.argv[0]存放的是终端执行的程序名称也就是进程名。argv[1...argc-1]存放的是命令行参数。

2.所以思路就是修改argv[0]指向的内存空间的内容,进而达到修改进程名的方式。当然这儿需要注意,由于是修改内存空间,所以如果修改后的新名称比原本名称长,则还需要申请新内存保护后面的argv[1...argc-1]。

优点:ps -ef/aux等看不到此进程,原因是因为ps -ef是读取/proc目录下进程的cmdline,而此方法会修改cmdline

缺点:可以通过ps -A/-e或者top命令发现此进程,ps -A是读取的/proc目录下的comm来获取进程名,修改cmdline的隐藏方式无法隐藏进程名。

核心代码块 

   for(int j = 0; j < argc; j++)

    {

        size_t length = strlen(argv[j]) + 1;

        new_argv[j] = malloc(length);

        printf("length is %lu\n",(unsigned long)length);

        memcpy(new_argv[j], argv[j], length);  //从argv[j]复制length字节到new_argv[j]

        memset(argv[j], '\0', length);    //初始化argv[]指针指向的内存单元

    }

示例

FFF为恶意代码编译好的程序,使用上述代码将自身信息隐藏。此时ps -ef和ps aux无法看到此进程,但我们仍然可以通过ps -A看到实际的进程ID为4049685。前往该进程所在的在/proc目录下,此进程ID下可以看到进程名确为FFF,但进程cmdline为空。

2. 排查和检测方式:

排查方式:

1. 如上文所提,可以使用ps -A/ps -e(原因是因为ps -A读取的是进程名及/proc/pid/comm,所以把/proc/pid/cmdline清空依旧会看到)等方式看到此进程。如存在网络事件也可以结合网络信息进行排查。

 检测方式:

1. 如果监控方法是使用脚本式遍历/proc目录下面各进程的信息的方式则无法获取到实际的cmdline(可以对进程名和cmdline完全不一致的方式进行监控,比如进程名为FFF但实际cmdline为aaa这种完全不一致的情况进程监控告警)

2. 如果是实时从内核中取出pid的方式进行采集,则无论是替换还是清空,都是能成功获取到真正的cmdLine。

02

进阶版之修改进程cmdline且同时修改进程名

1.方法介绍和实现:

**上面这个方法修改了进程cmdline,**但是依旧不够完美。可以被ps -A等较为常用的读取进程名的方式发现,那么是否有方法可以将进程名同时隐藏到呢。顺着这个思路,攻击者将目光放到了prctl这个函数身上。

实现原理:

使用prctl函数(进程控制)进行操作和修改进程名。将此方法和上面的方法结合起来,就可以隐藏掉/proc/pid/目录下的comm和cmdline导致使用ps -ef或ps -A均无法读取到真实的进程信息,这种手法常用于各类挖矿木马以及部分蜜罐中。

实施后效果如下:

change为编译好的恶意文件,他在运行时首先使用方法一中的手法隐藏了自身cmdline,此时再调用prctl函数修改自身进程名。这个时候我们发现无论是使用ps –ef还是ps –A均已完全无法看到此进程名的信息。

使用这种手法看起来好像是已经天衣无缝难以检测了,但实际上还是存在缺点:

用于演示的进程是直接将进程名置空,虽然实施后无法直接搜索到此进程,但是ps -A会发现一个奇怪的进程,及只存在pid没有进程名的进程。具体信息如下图

这里我们发现pid为3038444的进程,进程名为空,前往/proc/3038444目录下面查看对应的进程信息

确认进程存在且该进程的comm和cmdline确实已被修改为空,但是可以从进程exe信息中看到实际进程的执行路径确为上述恶意文件。

2. 排查和检测方式:

排查方法:

和上面提到的一样,可以通过ps -A查看所有进程,确认是否存在进程名为空的特征进程(当然实际入侵中,攻击者也可能将进程名和cmdline伪装成一个正常的进程,这个时候入侵排查就需要联合日志,网络等其他信息多情况分析了)

03

劫持动态链接库

1.方法介绍和实现:

原理:

Unix操作系统中,程序运行时会按照一定的规则顺序去查找依赖的动态链接库,而在linux中先加载的so中的全局符号会屏蔽掉后载入的符号。环境变量LD_PRELOAD以及配置文件/etc/ld.so.preload允许你自定义在程序允许前优先加载动态链接库。所以我们可以在LD_PRELOAD加载的so中编写需要hook的同名函数,就可以实现劫持系统函数。

示例:

python启动一个反弹shell的进程,然后使用libprocesshider来hook readdir()函数:

原本ps命令可以看到实际进程信息,但是当我们劫持ld.so.preload后,发现相关信息已被隐藏。此时前往反弹shell进程pid:2241468目录下对进程信息进行排查。

可以发现实际上/proc目录中进程信息并未修改,因为这种手法只是hook系统函数,并未直接对进程进行修改。

此手法原理可以通过strace来进行更好的理解,当系统优先加载攻击者构造恶意的ld.so.preload,会导致hook readdir()系统函数,而ps命令去读取进程信息均是通过此函数实现的

2. 排查和检测方式

排查和检测方法**:**可以通过监控环境变量LD_PRELOAD以及配置文件/etc/ld.so.preload的状态来判断是否遭受攻击。

04

mount覆盖/proc/pid/目录

1. 方法介绍和实现:

原理:

使用mount -o bind的方式将另外一个目录挂载覆盖至/proc目录下指定进程ID的目录,这样无论使用ps,top等工具,还是遍历proc均无法查看到实际进程。

示例:

同样是先启动一个python反弹shell进程,然后将空目录/root/test/null这个空目录挂载到/proc/109598 pid下。实际效果如图,可以发现/proc/109598所有内容均为空。且HIDS中也无法再获取此进程信息(演示时时先启动进程进程然后手动进行mount挂载,实际攻击中可以在木马中同时进行)

此方法操作简单,且难以检测,故实际收到各种入侵者青睐。

2. 排查和检测方法:

排查和检测方法一致均为,检测/proc/$$/mountinfo或/proc/mounts确认是否有将其他目录或文件挂载到/proc下进程目录的行为对,这种将其余目录挂载到/proc/{pid}下的行为进行监控。

● 总结

以上就是几种常见的Linux中进程隐藏的方法,而在实际的攻击场景中攻击者的还有更多的攻击思路和手法。无论是直接在内核层hook proc_pid_readdir和tcp4_seq_show函数;还是直接劫持VFS;亦或是进程注入。都已是屡见不鲜的攻击手法,本文也只是简单介绍其中一二。攻防之道本就是技与技的切磋碰撞,当一种手法被揭开又会有更多的手法会被创新。敌人尚在不断变强,安全人员也更应努力学习。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2