Looking for light.

数字中国——数据安全产业积分争夺赛

Alt text

0x01 前言


数字中国数据产业积分争夺赛,说朴素点就是打各种安全的逆天题目。各种见过的没见过的打过的的没打过的全部一股脑端上来,甚至还有大数据社工(给孩子电脑都跑报废了)。不过还好拼尽全力打到初赛中部赛区第八名。感觉很有必要记录一下这次的赤石记录,豪赤!


0x02 WriteUp记录

0x021 ez_upload


非常基础的一道upload题目,phtml加上php短标签直接就梭哈了。沟槽的fuzz字典里面没有phtml,害的我fuzz半天都快红温了还没fuzz上去。顺手整了个UploadBypass小工具试了试,感觉挺好用的。可惜在上传重命名的情况时不太好使。以后可以尝试二开一下,感觉会很有用。


0x022 数据分析


队内平常做内存取证的哥们这把在打爬虫,所以只能我自己上了。说是取证,但因为没工具摸到raw文件后就没动静了。只出了第一个。提供了一个img文件,使用FTK Image可以直接打开(感谢软件系统安全赛的馈赠)。打开后就可以看到一个重要文件.docx,里面有一行被标白的数据,全选标黑即可。重点在于后面的raw文件取证。有机会复现补全WP。


0x022 数据社工


最吃性能的一组题目(确信)。要处理多到头皮发麻的数据量并从中准确盒出张华强的各项信息。入手点在于爬取的网页部分。使用python脚本硬爆可以直接爆出第2、3、4题的答案。

import os

def search_for_name(root_dir, target_name="张华强"):
    # 存储所有匹配的文件路径
    results = []
    
    # 遍历1到50的文件夹
    for folder_num in range(1, 51):
        folder_path = os.path.join(root_dir, str(folder_num))
        # 检查当前文件夹是否存在
        if os.path.isdir(folder_path):
            # 遍历文件夹中的html文件
            for file_num in range(1, 10001):
                file_path = os.path.join(folder_path, f"{file_num}.html")
                # 检查文件是否存在
                if os.path.isfile(file_path):
                    try:
                        # 打开文件并检查是否包含目标字符串
                        with open(file_path, "r", encoding="utf-8") as file:
                            content = file.read()
                            if target_name in content:
                                # 记录符合条件的文件夹和文件路径
                                results.append((folder_path, file_path))
                    except Exception as e:
                        print(f"无法读取文件 {file_path}: {e}")
    
    # 输出所有找到的结果
    if results:
        print(f"找到目标字符串 '{target_name}' 的文件如下:")
        for folder, file in results:
            print(f"文件夹: {folder}, 文件: {file}")
    else:
        print(f"未找到包含目标字符串 '{target_name}' 的文件。")

# 调用函数,当前目录作为根目录
root_dir = "."  # 当前目录
search_for_name(root_dir)

虽然是无脑暴力检索的模式,但速度确实还行,几分钟就可以将关键文件暴露出来。

Alt text

阅读这两个html,即可拿到关键信息。

Alt text

Alt text

至此我们就拿到了三道题目的答案。剩下两道社工题待有时间再钻研一下吧。


0x023 数据攻防


算是最简单的一组题目了,给了一个http.log与很大的pcapng流量包。题目一要求我们观察数据包中的sqlite盲注流量,并从中提取出黑客盲注出的账密。

Alt text

做的比较仓促,直接用脚本把pcapng硬开后将sqlite流量以关键词提取出来

def extract_lines(input_file, output_file):
    # 1. 二进制模式读取
    with open(input_file, 'rb') as fin:
        binary_data = fin.read()
    
    # 2. 强制用 utf-8 解码并忽略错误
    text_data = binary_data.decode('utf-8', errors='ignore')
    
    # 3. 按换行符拆分成“行”
    lines = text_data.splitlines()
    
    # 4. 搜索包含 /randomPassword?level= 的行并输出
    with open(output_file, 'w', encoding='utf-8') as fout:
        for line in lines:
            if '/randomPassword?level=Baby-1' in line:
                fout.write(line + '\n')

if __name__ == '__main__':
    extract_lines('test.pcapng', 'result.txt')

提取出来后直接拉到底,可以发现最后注的关键词是fl4g_1s_here,写个脚本二次过滤

Alt text

def extract_lines(input_file, output_file, search_term):
    with open(input_file, 'r', encoding='utf-8') as fin, \
         open(output_file, 'w', encoding='utf-8') as fout:
        for line in fin:
            if search_term in line:
                fout.write(line)

if __name__ == '__main__':
    # 输入文件名和输出文件名
    input_file = 'result.txt'  # 请替换成你的文件名
    output_file = 'result2.txt'
    search_term = 'fl4g_1s_here'
    
    extract_lines(input_file, output_file, search_term)

通过阅读语句可以发现是sqlite的布尔盲注。按逻辑我们把爆破的各个位的最后一条注入数据提取出来,其必定是布尔判断为true的结果。就可以拿到32位flag的每个字对应的16进制ASCII码。

Alt text

题目三很简单,以json数据标志性的{}把得到的个人数据全部提出来。然后统计phone的重复频率,把前三个拿出来即可。

def extract_lines(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as fin, \
         open(output_file, 'w', encoding='utf-8') as fout:
        for line in fin:
            # Check if the line starts with '{' and ends with '}'
            if line.startswith("{") and line.endswith("}\n"):
                fout.write(line)

if __name__ == '__main__':
    # 输入文件路径和输出文件路径
    input_file = 'http.log'  # 请替换成你的文件名
    output_file = 'out1.txt'  # 输出的文件名
    
    extract_lines(input_file, output_file)
import re
from collections import Counter

# 读取txt文件
def read_txt_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        return file.readlines()

# 解析每行数据
def parse_line(line):
    # 使用正则提取tit3的字段数据
    pattern = r'"phone":\s?"(\d+)"'
    match = re.search(pattern, line)
    if match:
        return match.group(1)
    return None

# 统计tit3字段的出现次数
def count_tit3_occurrences(file_path):
    lines = read_txt_file(file_path)
    tit3_values = []
    
    for line in lines:
        tit3 = parse_line(line)
        if tit3:
            tit3_values.append(tit3)
    
    # 使用Counter统计频次
    counter = Counter(tit3_values)
    
    # 获取前五个出现最多的tit3
    most_common_tit3 = counter.most_common(5)
    
    return most_common_tit3

# 设置txt文件路径
file_path = 'out1.txt'  # 请替换为你实际的文件路径

# 获取并打印结果
most_common_tit3 = count_tit3_occurrences(file_path)
print("phone字段出现次数最多的前五个号码:")
for item in most_common_tit3:
    print(f"{item[0]}: {item[1]}次")

0x03 总结

好无敌的比赛,各样式的题目库库上,给哥们几个全打懵逼了快。还好大伙的技术栈够全面,在中部赛区拼尽全力也算是拿个第八进决赛了。