前言

在日常的应急工作中,经常遭遇挖矿病毒的案例,但是往往用ps,top等命令是看不到异常的,且即使kill掉进程和计划任务项往往过一会进程就会重新起来。这种情况往往是存在预加载恶意动态链接库的后门,其实网上有很多详细的文章去讲解这个技术,这里笔者也是为了插个眼。

概述

动态链接库预加载机制是系统提供给用户运行自定义动态链接库的一种方式,在可执行程序运行之前就会预先加载用户定义的动态链接库的一种技术。

原理

在网上有大佬已经做了总结,感兴趣的可以去看看:

https://www.freebuf.com/column/162604.html

1.  应用程序在通过系统接口调用内核时会预先加载动态链接库, 即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被加载。

    2.  这个库里面主要包括两个内容:LD_PRELOAD和/etc/ld.so.preload

    3.  LD_PRELOAD用于预加载环境变量

    4.  /etc/ld.so.preload用于预加载配置文件

    5.  默认情况下LD_PRELOAD和/etc/ld.so.preload无配置

    6.  动态编译:不论程序依赖不依赖动态链接库,都会加载LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,他们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级高

   
    7.  全局符号:全局符号介入指的是应用程序调用库函数时,调用的库函数如果在多个动态链接库中都存在,即存在同名函数,那么链接器只会保留第一个链接的函数,而忽略后面链接进来的函数,所以只要预加载的全局符号中有和后加载的普通共享库中全局符号重名,那么就会覆盖后装载的共享库以及目标文件里的全局符号。
        注:这也是造成劫持的某种手段

    8.  静态编译:不动态加载系统库文件,直接将程序所需要的各种文件全部集中到该软件平台中,这样就可以解决系统库文件被劫持,中了rootkit等导致连接、网络等被隐藏的情况,常用的工具如busybox

根据上图,可知库劫持主要有3种利用方式:

1、更改LD_PRELOAD环境变量的值,用以加载恶意动态链接库
2、修改/etc/ld.so.preload配置文件内容,用以加载恶意的动态链接库<strong>(主要利用方式)</strong>
3、修改动态链接器的值,比如修改预加载的配置文件路径(/etc/ld.so.preload)为自定义路径,或者修改默认环境变量等

利用方式及检测

劫持LD_PRELOAD

利用方式

这种方式相对比较简单,默认情况下LD_PRELOAD变量是空

利用方式:

LD_PRELOAD=/lib/evil.so  #LD_PRELOAD的值设置为要预加载的动态链接库
export LD_PRELOAD        #导出环境变量使环境变量生效
unset LD_PRELOAD         #解除设置的LD_PRELOAD环境变量

检测方式

因为利用方式是通过更改环境变量LD_PRELOAD的值加载恶意文件,所以可以通过直接查看环境变量的值 “echo $LD_PRELOAD”即可查看是否存在劫持。

或者可能存在echo命令被劫持,可以选择用busybox来执行这条命令。同时也可以通过”strace“命令来跟踪相关命令加载的库文件来分析。因为正常预加载的就两个”LD_PRELOAD“ 和 ”/etc/ld.so.preload”,因此这种方式也可以作为判断依据

处置方法

  • 将LD_PRELOAD环境变量的值重新置为空

  • 删除恶意的动态链接库文件

劫持/Etc/Ld.So.Preload

利用方式

这种劫持方式目前来说是比较主流的劫持方式,主要是通过修改/etc/ld.so.preload文件的内容,同时劫持后会无法用TAB键补齐/etc/ld.so.preload文件,cat命令也会被预加载的库文件劫持。

检测方式

由于劫持动态链接库文件后,系统命令被修改,TAB补齐等方式失效,所以需要使用busybox执行命令,同时手工输出全路径。

或者,可以利用“strace”命令追踪系统命令的加载情况。(注:strace命令后接less命令,避免文件太多卡死)

处置方法

  • 去掉/etc/ld.so.preload文件的隐藏属性

  • 删除加载的恶意动态链接库文件

劫持动态链接器

利用方式

修改动态链接器实现恶意功能有多种方法。常规为替换动态链接器中的默认预加载配置文件/etc/ld.so.preload为自定义文件路径。

检测方式

  • 动态链接器完整性检查

修改动态链接器后会破坏原有文件的完整性,可以使用rpm校验功能,来检测是否发生改变

  • strace命令查看预加载配置文件

可以通过strace命令查看系统命令的预加载配置文件是不是/etc/ld.so.preload文件(注:strace命令后接less命令,避免文件太多卡死)

使用busybox自带的cat命令查看该文件,因为使用正常cat命令无法查看该文件,被预加载的库函数给隐藏

处置方法

清除修改动态链接器的rootkit,需要使用相同系统的相同版本动态链接器替换被修改了的动态链接器,才能达到彻底清除的目的,暂时缓解的方式则是将上方检测过程中看到的恶意动态链接库删除,以及将对应的动态链接库配置文件中的内容清除。

参考链接

https://www.freebuf.com/column/162604.html

https://www.freebuf.com/articles/system/223311.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐