文档章节

LD_PRELOAD 后门<转载>

超级大黑猫
 超级大黑猫
发布于 05/16 09:09
字数 2927
阅读 48
收藏 0
点赞 0
评论 0

一、动态链接库预加载型rootkit概述

动态链接库预加载机制是系统提供给用户运行自定义动态链接库的一种方式,在可执行程序运行之前就会预先加载用户定义的动态链接库的一种技术,这种技术可以重写系统的库函数,只需要在预加载的链接库中重新定义相同名称的库函数,程序调用库函数时,重新定义的函数即会短路正常的库函数,这种技术可以用来重写系统中有漏洞的库函数,达到修复漏洞的目的,如get_host_byname导致ghost漏洞的这类函数。这种技术也可以被不怀好意的攻击者用来写rootkit,通过重写mkdir, mkdirat, chdir, fchdir, opendir, opendir64, fdopendir, readdir, readdir64等和系统文件,网络,进程相关的库函数来达到隐藏文件,进程的目的。相对于普通的用户空间rootkit而言,手段更加隐蔽,更加难以被发现,相对于内核模块rootkit来说,兼容性更好,编写难度更低,综合这两种优点,使得这类型rootkit逐年增多,难以查杀。

 二、动态链接库预加载型rootkit所用技术

应用程序执行流程.png

2.1 linux动态链接库预加载机制

在linux操作系统的动态链接库加载过程中,动态链接器会读取LD_PRELOAD环境变量的值和默认配置文件/etc/ld.so.preload的文件内容,并将读取到的动态链接库进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。

2.2 全局符号介入

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

2.3 rootkit利用的技术点

因为动态链接库预加载机制和全局符号介入这两种系统机制,可以控制程序运行时的链接(Runtime linker),允许用户在程序运行前优先加载自定义的动态链接库,使得恶意动态链接库优先于正常动态链接库加载,根据全局符号介入的顺序原理来”短路”正常函数,执行攻击者定义的恶意函数。

 利用点.png

从上图中我们可以看到3种利用方式:

1. 将恶意动态链接库通过LD_PRELOAD环境变量进行加载。

2. 将恶意动态链接库通过/etc/ld.so.preload配置文件进行加载。

3. 修改动态链接器来实现恶意功能,例如修改动态链接器中默认的用于预加载的配置文件路径/etc/ld.so.preload为攻击者自定义路径,然后在里面写入要加载的恶意动态链接库,当然修改的姿势还有很多,如修改默认环境变量,直接将要hook的动态链接库写入到动态链接器当中。

三、动态链接库预加载型rootkit

3.1 利用LD_PRELOAD加载恶意动态链接库

3.1.1 安装

LD_PRELOAD环境变量是会及时生效的,使用LD_PRELOAD加载恶意动态链接库方法如下:

LD_PRELOAD=/lib/evil.so LD_PRELOAD的值设置为要预加载的动态链接库

export LD_PRELOAD 导出环境变量使该环境变量生效

unset LD_PRELOAD 解除设置的LD_PRELOAD环境变量

测试使用的rootkit下载地址https://github.com/mempodippy/cub3

LD_PRELOAD示例.png

3.1.2 检测

直接打印出LD_PRELOAD的值(默认LD_PRELOAD环境变量无值),如果LD_PRELOAD中有值,则将该文件上传到virustotal或微步在线等恶意软件检测平台检测该文件是否正常,或者用自制的特征进行匹配或者人工strings或者用ida看一下,即可判断出是否是恶意程序。

图片9.png

3.1.3 清除

使用命令unset LD_PRELOAD即可实现卸载使用LD_PRELOAD环境变量安装的恶意动态链接库。如下图,可以看到被隐藏的文件evil.so显示出来了。

图片1.png

3.2 利用/etc/ld.so.preload加载恶意动态链接库

3.2.1 安装

将恶意动态链接库路径写入/etc/ld.so.preload(没有则创建)配置文件中,如下图所示将恶意动态链接库路径写入/etc/ld.so.preload文件中即生效,对应的恶意动态链接库文件被隐藏

图片2.png

3.2.2 检测

因为恶意动态链接库一般都有隐藏/etc/ld.so.preload文件的功能,我们使用普通的ls,cat等命令无法读取对应配置文件的内容,此时我们可以使用静态编译的ls命令,cat命令(推荐使用busybox自带命令)来绕过预加载的恶意动态链接库,如果没有ls命令cat命令,有时候将ls命令和cat命令改成其他任意字符也可以绕过恶意动态链接库的隐藏,主要得看恶意动态链接库具体实现方式。

如下图,通过使用普通的cat命令和busybox中的cat命令查看/etc/ld.so.preload文件内容对比,即可判断出是否有通过/etc/ld.so.preload配置文件加载的恶意动态链接库。

图片3.png

3.2.3 清除

因为恶意动态链接库具有隐藏文件的功能,所以清除时需要使用静态编译的基础命令来进行对应操作,清除过程如下所示

首先清除上方/etc/ld.so.preload文件中查看到的/lib/evil.so文件,使其无法正常预加载,然后清除/etc/ld.so.preload中的恶意文件内容,有的恶意动态链接库会修改该文件的隐藏权限,以及普通的读写权限,所以需要看一下,然后再清除,到此为止即清除成功。(因为我这里以前就没有配置预加载的库,所以直接清空,如果你们有业务配置了预加载的库则需要清除特定行,而不是直接清空)

图片4.png

3.3 修改动态链接器来实现恶意功能

3.3.1 安装

修改动态链接器实现恶意功能目的有多种方法,这里使用替换动态链接器中的默认预加载配置文件/etc/ld.so.preload路径的rootkit,来实现更加隐蔽的恶意动态链接库预加载,安装的方法是修改动态链接器中配置文件路径/etc/ld.so.preload为自定义的路径,然后再在该路径中写入要预加载的恶意动态链接库的绝对路径。测试使用的恶意rootkit名称为Vlany,下载地址为https://github.com/mempodippy/vlany 

3.3.2 检测

修改默认动态链接器来达到实现恶意功能的目的会破坏原有动态链接器的完整性,我们可以使用文件完整性检查来检查该动态链接器是否被修改

首先获取系统中的动态链接器的文件路径,然后判断该动态链接器文件的完整性。这里测试系统是centos,自带rpm校验功能,下图中的5指的是文件的md5发生了改变,T指的是修改时间发生了改变。

图片5.png

如果知道了动态链接器被修改过,(排除系统升级导致)那么可以判断动态链接器存在较高的安全风险,我们需要对该修改进行进一步确认,如果攻击者修改动态链接器但是实现恶意功能的方式不是修改了预加载配置文件,而是修改了默认的环境变量,或者直接根据开源代码将恶意功能植入动态链接器然后重新编译生成的恶意动态链接器,那么下面的检测方法可能是无效的,需要视情况分析。

 使用strace命令来查看预加载的配置文件是不是/etc/ld.so.preload文件,如下图,动态链接库预加载的配置文件是/sbin/.XsknPn3F而不是原有的配置文件,我们即可确认系统中存在修改动态链接器的rootkit

图片6.png

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

图片7.png

图片8.png

3.3.3 清除

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

四、通用检测方法总结

根据动态链接库预加载机制可知,预加载型恶意动态链接库只对需要使用动态库函数的程序有效,恶意动态链接库基本功能隐藏文件,根据隐藏文件功能的特点,所以我们检测的思路是应用程序尽量不使用动态库,即可绕过这个文件隐藏的功能

交叉试图:

使用普通ls命令对特定目录下文件进行查看,使用静态编译的基础命令来对特定目录文件进行查看,必看文件/etc/ld.so.preload经典目录/lib/判断是否有隐藏文件,应急响应时推荐使用busybox,或者自己静态编译的ls等命令

动态链接库预加载机制会读取预加载配置文件内容,然后加载配置文件中对应的动态链接库,根据这一特性,可以通过跟踪常用命令执行过程中加载的文件,来判断是否存在恶意动态链接库。

strace文件跟踪:

可执行程序运行时,首先会访问动态链接库预加载配置文件,然后读取对应配置文件中的动态库,并预先加载,然后再去加载正常所需链接库,通过跟踪系统/bin/ls打开的相关文件,即可找到预加载配置文件以及被预加载的动态链接库,如果恶意动态链接库有反strace措施,可以修改strace名称或使用LD_PRELOAD环境变量预先加载一个无关动态链接库,然后再strace进行跟踪,可以绕过恶意动态链接库的根据可执行程序名称检测的反strace措施。

文件完整性检查:部分攻击者通过修改动态链接器的方式实现恶意功能的目的,但这种做法会破环动态链接器的完整性,通过检测动态链接器的完整性即可检测出修改动态链接器型rootkit。

五、引用

https://github.com/mempodippy/vlany 修改动态链接器rootkit 

https://github.com/mempodippy/cub3 用于预加载的恶意动态链接库

© 著作权归作者所有

共有 人打赏支持
超级大黑猫
粉丝 4
博文 95
码字总数 36018
作品 0
杭州
程序员
libc.so.6共享库恢复

最近遇到机房的一台虚拟机(测试机器)的libc库的软链libc.so.6被删除了,实际文件libc.2.4.so还在。 机器现状: 还有shell远程连入,但是各种命令都不能再使用: /bin/ls: error while loa...

active_health
2016/07/28
21
0
安全研究 Linux 遭入侵,挖矿进程被隐藏案例分析

  一、背景   云鼎实验室曾分析不少入侵挖矿案例,研究发现入侵挖矿行为都比较粗暴简单,通过 top 等命令可以直接看到恶意进程,挖矿程序与进程不会被刻意隐藏;而现在,我们发现黑客开始...

FreeBuf
06/26
0
0
Tomcat 本地提权漏洞预警

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特...

凝小紫
2016/10/09
3.6K
15
/lib/libc.so.6: ELF file OS ABI invalid

升级python时 在更新rpm包时把 libc包更新了,导致系统报错,所有linux指令都执行不了 linux版本 是centos5.11 x64 位 /lib/libc.so.6: ELF file OS ABI invalid -----libc.so.6实质是一个软...

zhengminghao
2017/10/13
0
0
linux C 包装函数使用

以前在meego性能优化团队实习的时候,为了提高APP启动速度,我曾计算APP调用malloc的次数和耗时,并以此数据为依据探讨内存池对软件优化的可能性。通俗地讲,我需要将某些函数的调用重定向到...

金桔柠檬茶
2016/10/08
16
0
UNIX下的LD_PRELOAD环境变量

前言 也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久。不过,在这里,我还是想讨论一下这个环境变量。因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注...

quanwei9958
2014/12/22
0
0
proxychains-ng 工作原理分析

概要 linux 中使用 mac osx 中使用 在 环境下 对网络相关的 API(, 见 ) 进行 hook 实现代理的功能 细节 待续 references https://github.com/rofl0r/proxychains-ng http://www.catonmat.ne...

邪云子
2016/05/04
219
2
Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,可能很多人,甚至包括一些高手,对共享库相关的一些环...

鉴客
2011/09/28
278
0
利用环境变量LD_PRELOAD来绕过php disable_function执行系统命令

0x00 前言 在做渗透测试的时候如果遇到安全配置比较好的服务器,当你通过各种途径获得一个php类型的webshell后,却发现面对的是无法执行系统命令的尴尬,因为这类服务器针对命令执行函数做了...

超级大黑猫
05/16
0
0
在Ubuntu 14.04中使SublimeText 3支持中文输入法

在Ubuntu 14.04中安装了SublimeText 3之后发现既然不支持输入中文,于是在网上搜罗一下,发现很多人遇到了同样的问题,但是解决办法大该就只有一个。下面根据自身的安装及解决办法总结如下:...

赵小宾
2015/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部