翻译 | Linux利用动态链接共享对象库提权

Linux利用动态链接共享对象库提权

RPATH和弱文件权限会导致系统的损害。Linux应用程序可以利用动态链接的共享对象库(我们从现在开始称它们为共享库)来提供应用程序功能,而不必重复编写相同的代码-有点像Windows应用程序中的DLL文件。就像在Windows上的DLL植入攻击一样,Linux共享库与弱文件权限相结合,可以用来执行任意代码并危害Linux系统。

操作系统如何查找共享库?

运行使用共享库的应用程序时,操作系统按以下顺序搜索库(来自https://linux.die.net/man/1/ld):

  1. 任何由rpath-link选项指定的目录(由rpath-link选项指定的目录仅在链接时有效)
  2. 任何由rpath选项指定的目录(rpath选项指定的目录都包含在可执行文件中,并在运行时使用)
  3. LD_RUN_PATH
  4. LD_LIBRARY_PATH
  5. DT_RUNPATH或DT_RPATH中的目录。(如果存在DT_RUNPATH条目,则忽略DT_RPATH条目)
  6. /lib和/usr/lib目录
  7. /etc/ld.so.conf中的目录

我们怎么能得到root权限?

如果攻击者可以用一个恶意代码替换一个共享库,那么当应用程序运行时,它将加载恶意代码并以所有者的权限执行。如果应用程序以root身份运行,则会导致主机完全损害。

攻击者可能需要耐心等待应用程序由用户运行,或者使用社会工程学的元素诱骗系统管理员运行藏有恶意代码的程序并执行恶意代码。如果在系统启动时调用应用程序,由cron调用作业或进程,则利用可能会更快。

为了识别共享库使用的二进制文件,可以使用ldd工具:

可以跟踪下列攻击路径,以确定使用共享库的二进制文件是否容易受到攻击:

示例:

我将演示一个示例,其中使用RPATH编译的二进制文件结合弱文件权限可以导致获得root权限。

运行ldd识别二进制文件查看它使用的共享库:

当objdump运行时,你可以看到它已经被编译成一个静态的RPATH指向/tmp/program/main:

默认情况下,/ tmp分区是可写的,如果没有NOEXEC标志创建,那么分区将允许攻击者编写恶意共享库,当“contextBinary”运行时将执行该库。在服务器上,有一个root用户的cronjob恰好执行脆弱的二进制文件:

在这个例子中,我们将使用metasploit框架来创建一个我们可以在系统上植入的共享库。 首先在攻击者的主机上设置一个处理程序:

然后创建恶意库。由于我们正在利用第一个位置,操作系统将寻找一个共享库,我们可以模仿应用程序使用的任何库:

我已经使用msfvenom创建了一个共享库,其有效载荷与我的处理程序相同:

在易受攻击的主机上,创建了目录结构,并使库成为可写的:

一旦cronjob运行,恶意库就会被执行,在我们的metasploit控制台中,我们成功得到一个以root身份运行的shell会话:

我该如何防范呢?

作为系统管理员:

这种攻击归结为薄弱的文件权限,所以要确保低权限用户无法写入:

  • 在RPATH或RUNPATH中指定的位置
  • 在LD_RUN_PATH和LD_LIBRARY_PATH环境变量中指定的位置
  • /lib或/usr/lib
  • 在/etc/ld.so.conf中指定的位置

作为一名开发人员:

如果必须用RPATH或RUNPATH编译一个库,那么请指定该目录只有二进制所有者或root才能写入。或者指定$ORIGIN变量,该变量将在运行时解析到二进制文件的任何位置。

或者,可以将库移动到/lib或/ur/lib,然后使用chrpath工具从编译的二进制文件中删除RPATH或RUNPATH。

其他需要注意的事项:

  • 用最小的权限执行应用程序。由Root调用的恶意二进制文件将导致对主机的完全损害。
  • 考虑在/tmp分区上设置NOEXEC选项

本人英语水平不是很高,有误之处,还请指正。

原文发布于微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807)

原文发表时间:2018-01-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木制robot技术杂谈

懒人神器 autoenv

前言 每次去不同的项目下运行程序都要更改相对应的 Python 环境,那么有什么办法可以省去这繁琐的一步吗?答案肯定是有的,Kenneth Reitz 已经为我...

4126
来自专栏一个爱瞎折腾的程序猿

初次尝试Linux并记录一二

若出现 服务器拒绝了SETP连接,但它监听FTP链接。。。没有安装sshd 解决方案

1081
来自专栏LinXunFeng的专栏

hexo+github 搭建个人技术博客

1703
来自专栏IT笔记

Linux下如何查看CentOS版本

今天iptables居然不能使用了,赶紧查看了一下Linux版本了。居然更新到了CentOS7。 这里分享下查看命令: cat /etc/redhat-rele...

6259
来自专栏mukekeheart的iOS之旅

Mac OS Sierra如何打开任何来源

  我们知道在Mac升级到最新的Mac OS Sierra系统之后,随之而来的是第三方应用都无法打开,提示的是无法打开或扔进废纸篓。而在之前的版本系统中,我们知...

3815
来自专栏用户画像

7.4.1 程序查询方式

信息交换的控制完全由主机执行程序实现,程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(状态端口)。当主机进行I/O操作时,首先发出询问...

891
来自专栏程序员互动联盟

如何简单快速调试高大上的谷歌浏览器

上一篇我们简单的将了在Ubuntu上编译chromium,android content_shell_apk的编译,一切顺利的就能生成apk。但是我们仅仅只是照...

38016
来自专栏小狼的世界

20个Linux服务器安全强化建议(三)

iptables 是一个Linux内核提供的,运行在用户空间的程序,它允许用户配置自己的防火墙策略。我们可以使用防火墙将不必要的流量过滤出去。使用 iptabl...

1463
来自专栏电光石火

IDEA切换git分支

点击右下角的git:master,然后选择origin/master,然后选择你要切换的分支,我目前在master分支,换dev分支就选择origin/dev,...

6613
来自专栏任浩强的运维生涯

调用redis的时候二维码不断刷新的排查

一、背景和现象。 项目是PHP开发的,点击登录的时候就根据随机数生成了二维码,缓存在了redis。用户用微信扫描了二维码分析出需要请求的链接,然后微信浏览器就请...

3635

扫码关注云+社区

领取腾讯云代金券