有趣的 LD_PRELOAD 前言 LD_PRELOAD 是 Linux 系统中的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库...但是由于程序是在运行时动态加载,这就存在一个问题,假如程序动态加载的函数是恶意的,就有可能导致一些非预期的执行结果或者绕过某些安全设置。...LD_PRELOAD LD_PRELOAD 是 Linux 系统中的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。...LD_PRELOAD Hook 由于 LD_PRELOAD 可以指定在程序运行前优先加载的动态链接库,那我们可以重写程序运行过程中所调用的函数并编译成动态链接库文件,然后通过指定 LD_PRELOAD...: gcc -shared -fPIC hook_strncmp.c -o hook_strncmp.so 然后通过环境变量 LD_PRELOAD 来设置 hook_strncmp.so 能被其他调用它的程序优先加载
但是由于这些终端程序默认并不支持 Socks 5 代理或 HTTP 代理 通常我们的解决方法就是使用环境变量 export ALL_PROXY=socks5://proxyAddress:port 或者...返回成功后,这个程序以为自己连的是原始的地址,但其实连的是 graftcp-local 的地址。这个就叫“移花接木”。...如果直接往运行在子进程的被跟踪程序的 buffer 添加信息,可能会造成缓冲区溢出,造成程序崩溃或者覆盖了其他数据。...主要有:全局式、设置环境变量式和仅针对程序(或进程)式。 全局式:比如使用 iptables + RedSocks 可以把系统符合一定规则的流量转换为 SOCKS5 流量。...设置环境变量方式:一些程序启动时会读取 proxy 相关的环境变量来决定是否将自己的数据转换为对应代理协议的流量,比如 curl 会读取 http_proxy, ftp_proxy, all_proxy
unsetenv删除环境变量LD_PRELOAD,否则会导致下面system函数打开一个新进程执行的命令又再次使用到strcmp函数, 进入一个死循环, 而且我们写的劫持函数返回的结果是异常的, 就会导致服务器崩掉...-fPIC /test/strcmp_hook.c -o hack.so -ldl 设置 LD_PRELOAD export LD_PRELOAD=/test/hack.so 运行命令触发覆盖函数...vi 检查是否存在 LD_PRELOAD 后门的时候可以直接运行echo $LD_PRELOAD 可以看到完成变量设置之后执行vi就会执行ifconfig命令 遇到个奇怪的问题: 在完成以上操作后发现执行...,对其进行劫持 # 可以在php文件里面只执行一个函数,然后我们就可以看到该函数执行了哪些系统命令 查看环境变量的方式: echo LD_PRELOAD env set export #值得注意的是...export设置的环境变量只在当前shell有效 # 例如在xshell一个窗口设置好LD_PRELOAD变量后再打开一个窗口输出LD_PRELOAD变量显示为空 cat /proc/PID/environ
大致步骤如下 生成一个我们的恶意动态链接库文件 利用putenv设置LD_PRELOAD为我们的恶意动态链接库文件的路径 配合php的某个函数去触发我们的恶意动态链接库文件 RCE并获取flag 这里面的某个函数需要在运行的时候能够启动子进程...,这样才能重新加载我们所设置的环境变量,从而劫持子进程所调用的库函数。...LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。...这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。...一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。putenv()用来改变或增加环境变量的内容.
应用程序在通过系统接口调用内核时会预先加载动态链接库, 即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被加载。...动态编译:不论程序依赖不依赖动态链接库,都会加载LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载 7....LD_PRELOAD=/lib/f1c8d7.so 将LD_PRELOAD的值设置为要预加载的动态链接库 2....四、如何检测库文件劫持 前面我们看到针对Linux的库文件劫持,常用的方法就三种: 更改LD_PRELOAD环境变量,加载恶意库文件 /etc/ld.so.preload加载恶意的库文件(主流的劫持技术...4.3.1 分析LD_PRELOAD环境变量劫持 根据Linux的预加载机制,相应的系统命令都会加载LDPRELOAD环境变量指定的内容,因此可以通过strace来跟踪相应系统命令加载的库文件来分析,我们知道
此功能有多种用途,包括调试、测试和运行时检测,可以通过写入文件/etc/ld.so.preload或使用环境变量LD_PRELOAD来使用。...运行ls并检查所有目录条目。5. 导出到LD_PRELOAD共享对象的位置: export LD_PRELOAD=/tmp/working-dir-test/libhijackls.so6....再次运行ls,您将看到我们成功劫持了该函数,并且输出不包含“malicious_file”。7. 最后,通过运行unset LD_PRELOAD取消设置环境变量。...不同的是,LD_PRELOAD是一个环境变量,它允许单个用户为每个进程指定要为特定可执行文件或命令预加载的库。因此,您无需成为 root 用户即可使用它。...对于LD_PRELOAD:搜索使用意外环境变量执行的进程(每个进程的所有环境变量都位于/proc/{pid}/environ下)。如果您发现不常见的库路径,请检查它。
;第三种,mod_cgi 模式,尝试修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制;第四种,利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so...由于程序运行时会根据命令行选项、运行环境作出不同反应,导致真正运行时调用的 API 可能只是 readefl 查看的子集,你可以运行 strace -f /usr/bin/id 2>&1 跟踪实际 API...linux 的环境变量 LD_PRELOAD 是一种类似 win32 API hook 的更优雅的实现,适用于打热补丁、读取进程空间数据、禁止程序调用指定 API、调试程序等等场景,甚至可以在不更改原始可执行文件前提下植入后门...最后,借助环境变量 LD_PRELOAD 劫持系统函数 getuid(),获取控制权。...mail.php 内增加设置 LD_PRELOAD 的代码: ?
fz41=system(ls); 没有任何回显 环境配置成功,我们的任务就是通过劫持函数的方法来绕过这个disable_functions 的限制,利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意...原理解读 LD_PRELOAD的作用 LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。...这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。...一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的 我们要做的就是通过修改环境变量LD_PRELOAD,让php启动新的进程的时候加载我们设置好的函数...因此,可以通过这个方式来构造函数,把我们要执行的命令放在环境变量里,执行时直接加载环境变量的命令,就可以做到绕过了 代码类似这种 #define _GNU_SOURCE #include <stdlib.h
; 可重复编程的外设 ?...注:在Linux/Unix操作系统,LD_PRELOAD是一个环境变量,可以影响程序的运行时的链接(Runtimelinker),设置在程序运行前优先加载的动态链接库。...通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。...一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。 2....Android转移Windows机器的网络流量 “我能借用你的笔记本给手机充电吗?”Android手机是最简单的USB攻击平台。 ?
1、编译选项 1.1 Gcc编译选项 -fsanitize=address:开启内存越界检测 -fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行...,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;若未设置此选项,则内存出错即报错退出, ASAN_CFLAGS += -fsanitize...2、ASAN运行选项 2.1 ASAN_OPTIONS设置 ASAN_OPTIONS是Address-Sanitizier的运行选项环境变量。...LSAN_OPTIONS是LeakSanitizier运行选项的环境变量,而LeakSanitizier是ASAN的内存泄漏检测模块,常用运行选项有: exitcode=0:设置内存泄露退出码为0,默认情况内存泄露退出码...其次,平台软件通常都会内部实现一套内存操作接口,为使用asan工具,需要替换成glibc提供的接口。此时,可以通过LD_PRELOAD环境变量解决这类问题。
需求 有时候需要测试业务程序,把时间指定到一个特定的时间去测试,如何在修改容器时间而不影响宿主机时间? 解决方法 GitHub 有一个开源的 libfaketime 项目,能解决这个问题。.../github.com/wolfcw/libfaketime 支持平台 Linux MacOs 安装 注意:必须 sudo make install,否则 libfaketime.dylib.1 没有运行权限...$ LD_PRELOAD=/path/to/libfaketime.so.1 FAKETIME="-3d" date Sun Mar 23 21:01:48 CST 2019 # 可以通过设置临时...LD_PRELOAD 环境变量 $ export LD_PRELOAD=/path/to/libfaketime.so.1 # 可以加入到 ~/.bashrc 目录中 $ echo "LD_PRELOAD...更多用法可参考 GitHub 上的说明 https://github.com/wolfcw/libfaketime
结合glibc动态链接器,攻击者就可以使用特殊的环境变量(如LD_PRELOAD)导致执行任意代码。 安恒信息应急响应中心也将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。...漏洞信息 2 漏洞描述 近日GoAhead官方发出安全公告,服务器通过GET参数设置环境变量导致了恶意LD_PRELOAD环境变量设置,进而使得漏洞攻击者获得远程命令执行的权限,影响不容小觑。...该数组将作为接下来cgi调用的环境变量。可以看出正式这里对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。...漏洞复现 payload.c 将payload.c编译成动态链接库.so文件 查看编译好的文件 如果用该文件作为LD_PRELOAD动态链接库文件运行,运行任意程序则会有如下效果。...查看CGI程序中的0号fd文件,发现这是一个符号链接,指向一个tmp文件,我们再查看该tmp文件,最终确认该文件正是我们上传的恶意动态链接库文件。
结合glibc动态链接器,攻击者就可以使用特殊的环境变量(如LD_PRELOAD)导致执行任意代码。 安恒信息应急响应中心也将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。...漏洞信息 2漏洞描述 近日GoAhead官方发出安全公告,服务器通过GET参数设置环境变量导致了恶意LD_PRELOAD环境变量设置,进而使得漏洞攻击者获得远程命令执行的权限,影响不容小觑。...该数组将作为接下来cgi调用的环境变量。可以看出正式这里对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。 ? 漏洞复现 payload.c ?...查看编译好的文件 ? 如果用该文件作为LD_PRELOAD动态链接库文件运行,运行任意程序则会有如下效果。 ? 可以看到payload.so中的代码成功运行。 验证poc: ?...查看CGI程序中的0号fd文件,发现这是一个符号链接,指向一个tmp文件,我们再查看该tmp文件,最终确认该文件正是我们上传的恶意动态链接库文件。 ?
环境变量 原理简介: LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。...这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。...一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的攻击目的。...我们通过环境变量 LD_PRELOAD 劫持系统函数,可以达到不调用 PHP 的各种命令执行函数(system()、exec() 等等)仍可执行系统命令的目的。...sendmail调用的C函数(函数最好不带参数),内部为恶意代码,编译为.so文件,如geteuid()函数 3.运行PHP函数putenv(),设定我们的so文件为LD_PRELOAD,设置后新进程启动时将优先加载我们设置的
程序库可分三类:静态库,共享库和动态加载库 静态库,是在执行程序运行前就已经加入到执行码中,在物理上成为执行程序的一部分; 共享库,是在执行程序启动时被加载到执行程序中,这样的库可以被多个执行程序共享使用...动态加载库,其实并不是一种真正的库类型,应该是一种库的使用技术,应用程序可以在运行过程中随时加载和使用库。 ?...这时候我们使用export命令将LD_PRELOAD环境变量指向新创建的libc_puts共享库。...LD_PRELOAD环境变量用于指定要由加载程序首先加载的共享库,首先加载共享库使我们能够拦截函数调用,并且使用动态加载程序API,我们可以将最初想要的puts函数绑定到函数指针,并通过它传递我们能控制的参数...当然这是一种利用方式,因为我们创建的共享库将被加载到正在运行的进程的内存空间中,因此我们可以执行诸如转储进程的内存以在运行时检查内存或篡改运行时变量之类的事情,这将变得更加危险。 ? END
linux 链接器支持库打桩(library interpositioning), 允许我们截获共享库的调用,执行自己的代码,通过这个机制,可以给程序调试带来很多便利。...以上两种需要有源文件的情况下实现,而对于运行时打桩,只需要可以访问执行文件,利用动态链接器的LD_PRELOAD环境变量实现。...当加载程序时,解析未定义的引用时,动态链接器会先搜索LD_PRELOAD指定的库,然后才搜索其他,因此,通过把自己实现的动态库设置到这个环境变量,动态链接器加载时搜索的该库内有对应实现的函数,就会直接使用该函数而不会再搜索其他系统库...stderr); exit(1); } freep(ptr); printf("[debug] free %p\n", ptr); } #endif 编译动态库,然后在运行时设定环境变量即可.../out; unset LD_PRELOAD ## 其他任何的可执行程序都可以打桩 export LD_PRELOAD=".
今天这个漏洞实际上是对老漏洞的一次绕过,漏洞原理不是本文重点,我用两段简单的文字进行描述: 补丁对用户传入参数进行了黑名单过滤,LD_PRELOAD这类参数不再设置为环境变量。...但是我们看老的漏洞CVE-2017-17562,当时是将LD_PRELOAD设置成标准输入,即LD_PRELOAD=/proc/self/fd/0。...我们的目的是在服务器上上传一个可控内容的文件,然后将环境变量LD_PRELOAD设置为这个文件的路径,这样来劫持动态链接库。很容易想到另一个方法就是通过上传文件的形式来创建文件。...找到可包含的文件 那么我们如果想要利用这个漏洞,就必须找到可以被包含的文件,从上面的测试过程可以发现,临时文件其实已经被写入了,只不过其中文件名包含一个从0开始递增的数字,我们需要进行爆破。...设置为不超过16384的值,但需要比payload.so文件的大小要大个500字节左右,我这里设置为15000 发送这个数据包,就可以成功劫持到LD_PRELOAD: 这里的原理其实就是,pyaload.so
来源:公众号【编程珠玑】 网站:https://www.yanbinghu.com 运行时打桩 前面两种打桩方式,一种需要访问源代码,另外一种至少要访问可重定位文件。可运行时打桩没有这么多要求。...运行时打桩可以通过设置LD_PRELOAD环境变量,达到在你加载一个动态库或者解析一个符号时,先从LD_PRELOAD指定的目录下的库去寻找需要的符号,然后再去其他库中寻找。...,由于我们自己的打桩函数也叫malloc,因此我们通过运行时链接调用malloc函数,以便获取malloc的地址,而不是直接调用。.../main ptr is 0x245c010 实际上,你会发现,在设置了这个环境变量的终端下,这个打桩的动作对所有程序都生效: $ ls ptr is 0x1f1a040 ptr is 0x1f1a680...比如说,有个程序中checkPass的接口用来校验密码,如果这个时候使用另外一个动态库,实现自己的checkPass函数,并且设置LD_PRELOAD环境变量,就可以达到跳过密码检查的目的。
查看phpinfo发现确实设置了disable_functions: 千辛万苦拿到的Shell却变成了一个空壳,你甘心吗?...利用 LD_PRELOAD 环境变量 原理简述 LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库...我们通过环境变量 LD_PRELOAD 劫持系统函数,可以达到不调用 PHP 的各种命令执行函数(system()、exec() 等等)仍可执行系统命令的目的。...想要利用LD_PRELOAD环境变量绕过disable_functions需要注意以下几点: 能够上传自己的.so文件 能够控制LD_PRELOAD环境变量的值,比如putenv()函数 因为新进程启动将加载...getuid_shadow.so; 运行 PHP 函数 putenv()(用来配置系统环境变量),设定环境变量 LD_PRELOAD 为 getuid_shadow.so,以便后续启动新进程时优先加载该共享对象
LSM(Linux Security Modules) ---- 动态库劫持 Linux上的动态库劫持主要是基于LD_PRELOAD环境变量,这个环境变量的主要作用是改变动态库的加载顺序,让用户有选择的载入不同动态库中的相同函数...但是使用不当就会引起严重的安全问题,我们可以通过它在主程序和动态连接库中加载别的动态函数,这就给我们提供了一个机会,向别人的程序注入恶意的代码。...\n"); } 我们再写一段hookStrcmp的程序,让这个比较永远正确。...这是一个最简单的劫持 ,但是如果劫持了类似于geteuid/getuid/getgid,让其返回0,就相当于暴露了root权限。所以为了安全起见,一般将LD_PRELOAD环境变量禁用掉。...动态库劫持不太完全,劫持的信息有可能满足不了我们的需求,还有可能别人在你之前劫持了,一旦禁用LD_PRELOAD就失效了。
领取专属 10元无门槛券
手把手带您无忧上云