应急响应中Linux库文件劫持

前言

在日常的应急工作中,经常遭遇挖矿病毒的案例,但是往往用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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux动态链接劫持是一种常见的安全漏洞,攻击者利用该漏洞替换系统或应用程序所依赖的动态链接,以执行恶意代码或获取敏感信息。以下是对该问题的解释和预防措施: 动态链接(Dynamic Link Library,简称DLL)是一种可重用的代码和资源集合,它可以被多个程序共享调用。在Linux系统,动态链接以.so文件的形式存在。 攻击者可以通过将恶意的.so文件替换为目标程序所依赖的动态链接来实施动态链接劫持。当程序启动时,系统会自动加载并执行这个恶意的.so文件,从而使攻击者能够在目标程序执行任意代码。 为了防止动态链接劫持,我们可以采取以下措施: 1. 使用绝对路径加载动态链接:在程序指定绝对路径来加载所依赖的动态链接,而不是依赖于系统默认的搜索路径。这样可以确保加载的是正确的文件。 2. 使用相对路径加载动态链接:如果不方便使用绝对路径,可以使用相对路径加载动态链接。但要确保相对路径是可信的,以防止攻击者替换为恶意的文件。 3. 设置LD_LIBRARY_PATH环境变量:将LD_LIBRARY_PATH环境变量设置为只包含可信路径,以限制动态链接的搜索范围。 4. 定期更新和升级系统:及时安装系统和应用程序的安全补丁,以修复已知的漏洞。 5. 使用数字签名验证:对动态链接进行数字签名,并在程序验证签名,确保加载的是经过合法认证的文件。 通过以上预防措施,可以有效减少动态链接劫持的风险,并提升系统的安全性。同时,开发者应该对自己的代码进行安全审计和漏洞修复,以防止其他类型的攻击。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值