【CTF WriteUp】2023数字中国创新大赛网络数据安全赛道决赛WP(2)

news/2024/5/19 21:05:22 标签: python, CTF

2023数字中国创新大赛网络数据安全赛道决赛WP(2)

数据分析题目

菜的要死,各种不会,答案也不全,凑合吧

数据分析-bankmail

流量为邮件通信流量
在这里插入图片描述
将其中邮件部分导出,保存为eml文件并打开,看到Alice给Bob的第一封邮件
在这里插入图片描述
计算标题的md5进行提交,即为第一个答案。

将流10中的邮件提出,可以找到损坏内容
在这里插入图片描述
该损坏内容为被删去文件头的xls文件,补充文件头D0CF11E0A1B11AE1后打开,发现文件已加密
在这里插入图片描述
爆破得到密码red123,进入后可找到吕任均的身份证号,即为第二个答案。
在这里插入图片描述
在这里插入图片描述
最后一封邮件,是字符符号
在这里插入图片描述
内容为flag{dadff7dd-1b81-4f71-bc99-afd92572b82e},计算md5提交,即为第三个答案。

数据分析-badhole

使用工具打开,在app中发现一个奇怪的包名,内有被删除的另一个包名
在这里插入图片描述
正常包不会是这个结构。事后验证,提出base.apk并扔给virustotal,确认为恶意软件
在这里插入图片描述
包名mobi.infolife.taskmanager计算md5即为第一个答案**(奈何提交不对)**

(第二问不会)

然后尝试反编译base.apk失败。直接按照zip格式解压,可以发现有三个dex文件
在这里插入图片描述
使用dex2jar尝试将其转换为jar文件,仅有classes.dex成功,另外两个失败。classes.dex转换出的jar文件并没有什么内容,主要还是依靠读取的库文件。
在这里插入图片描述
在其so文件中可以找到一个解密函数
在这里插入图片描述
解密函数的方法是使用AES-ECB模式解密,填充为PKCS5,密钥为huangdh’l,.AMWK;。但是解密对象未知,还需要到java代码中寻找
在这里插入图片描述
在java代码中可以发现,decrypt解密函数解密的对象是结尾为.dex,但名字不是classes.dex的两个文件,即刚才我们试图反编译失败的两个文件。
在这里插入图片描述
于是我们通过代码将其解密,再次尝试反编译,成功。

python">from Crypto.Cipher import AES
key = "huangdh'l,.AMWK;"
cip = AES.new(key=key)
data = open("classes3.dex", "rb").read()
data2 = cip.decrypt(data)
open("classes3new.dex", "wb").write(data2)

还记得最开始的问题包名为mobi.infolife,在classes2.dex文件解密后的dex文件中未发现相关内容;在classes3.dex解密后反编译的java代码中存在相应的包。以下为Dr.Web vxCube提供的分析验证:
在这里插入图片描述
在classes3.dex解包后的内容中,有一个名称奇怪的包和类,其中有一个较长的数组。
在这里插入图片描述
在这里插入图片描述
将数组部分内容转为字符,可以得到192.168.5.167:44321,即为回连地址。此为第三个答案。

工具可以提取镜像中所有的图片,在其中找到威胁图片,此为第四个答案。
在这里插入图片描述
在数据库文件中可以找到删除的用户通讯录节点是4
在这里插入图片描述
可以看到编号4为客户乙
在这里插入图片描述
在这里插入图片描述
这里的备注即为第五个答案。

挑战区题目

挑战三:my_fault

请参考论文《Modulus Fault Attacks Against RSA-CRT Signatures》

挑战四:Beyond Pro

打开流量包,发现是一次攻击的流量,攻击者首先扫描各种隐藏文件,最终攻击者找到了.api.php,并开始发送攻击流量
在这里插入图片描述
攻击流量类似冰蝎流量。冰蝎流量使用AES加密,但在标准AES-128算法上进行了简单修改,在密文最后最加一个magic尾巴,随机产生一个随机长度的额外字节数组,简称aes_with_magic算法。由于我们暂时不知道加密密钥,所以只得写程序爆破。因为解密后攻击者的php流量特征过于明显,所以以攻击者某次的payload进行爆破:

python">#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64
import hashlib
from Crypto.Cipher import AES

def Decrypt(key, data):
    magicNum = int(key[:2], 16) % 16
    data = data[:len(data) - magicNum]

    c = AES.new(key, AES.MODE_ECB)
    decodebs = base64.b64decode(data)

    return c.decrypt(decodebs)

def Key_Brute(data):
    with open('pass.txt', 'rb') as f:
        plain = [i.strip() for i in f.readlines()]

    for i in plain:
        md5_enc = hashlib.md5(i).hexdigest()
        try:
            key = md5_enc[:16].encode()
            AES_dec = Decrypt(key, data).decode('utf-8')
            print(i)
            print(AES_dec)
            exit(1)
        except Exception as e:
            print('[-] Crack Failed')

if __name__ == '__main__':
    data = b''
    Key_Brute(data)

在这里插入图片描述
得到密码music。写程序解密服务器的应答内容,可在其中一个较长的返回中(流705)可以解密得到一个图片

python">#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import base64
import hashlib
from Crypto.Cipher import AES

def Decrypt(data):
    md5_enc = hashlib.md5('music').hexdigest()
    key = md5_enc[:16].encode()
    magicNum = int(key[:2], 16) % 16
    data = data[:len(data) - magicNum]

    c = AES.new(key, AES.MODE_ECB)
    decodebs = base64.b64decode(data)

    return c.decrypt(decodebs).decode('utf-8')

if __name__ == '__main__':
    ciphertext = open("ciphertext.txt", "r").read()
    j = json.loads(Decrypt(ciphertext)[:-2])
    open("temp.png", "wb").write(base64.b64decode(base64.b64decode(j["msg"])))

在这里插入图片描述
注意到,在HTTP对象中同样有一个图片
在这里插入图片描述
在这里插入图片描述
于是我们得到了两张内容相同,但大小不同的图片,后边就是盲水印工具的工作了,需要使用python3版本的那个blind-watermark,最终得到flag。
在这里插入图片描述


http://www.niftyadmin.cn/n/268307.html

相关文章

算法训练Day40:343. 整数拆分 96.不同的二叉搜索树

文章目录 整数拆分题解(动态规划)贪心 不同的二叉搜索树题解 整数拆分 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (62.22%)11660--0 Tags 数学 | 动态规划 Companies 给定一个正整数 n ,将其拆分为…

SOLIDWORKS培训|弧长如何标注

大家在使用SolidWorks软件时,如果想对不同形状的弧长度进行标注,可以试试以下方法。 ◉ 标注圆弧 点四下鼠标,需要点击弧线和两个端点。 我们先使用圆心起点圆弧工具绘制一个圆弧。 然后点击智能尺寸,点击圆弧,没错…

瑞芯微rk3568移植openbmc(六)----关于novnc和vnc音频传输

解决了vnc的H264/H265编码问题后,视频帧率上去了,带宽占用降低了,但随之而来的问题是声音呢?音频问题怎么解决?VNC协议是没有定义音频的,只传输视频不传输音频,既然H264的编码我们可以修改协议添…

1163. 按字典序排在最后的子串

题目: 给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。 示例 1: 输入:s “abab” 输出:“bab” 解释:我们可以找出 7 个子串 [“a”, “ab”, “aba”, “abab”…

第三章 用户身份

第三章 用户身份 一、用户身份与能力 1、UID分类 管理员UID为0:系统的管理员用户 系统用户UID为1-999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至正太服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制…

数据库做实验过程-------pyqt环境的配置

首先下载anacunda Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 找到windows最新版x86 64版本等待下载 双击运行安装包 此时一定要记录文件夹的位置,便于以后环境变量的配置。 别看是4.7但是以后可能会增加新的配置&…

从在线监测与故障诊断系统视角,探讨动设备安全运行的重要性

在工业生产中,动设备是生产线的重要组成部分,但是随着设备运行时间的不断延长,设备的损耗逐渐加大,设备故障和损坏的风险也随之增加,给生产效率和安全带来不小的影响。因此,如何保证动设备的安全运行成为了…

Django ORM中get和filter的区别和使用方法

get 和 filter 都是 Django ORM 中常用的查询方法,它们的返回值都是查询集,但有一些区别。 get 方法: 用于查询单个对象,如果查询结果集为空或者返回多个结果,将触发 DoesNotExist 或 MultipleObjectsReturned 异常。…