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

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的两个文件,即刚才我们试图反编译失败的两个文件。
在这里插入图片描述
于是我们通过代码将其解密,再次尝试反编译,成功。

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进行爆破:

#!/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)可以解密得到一个图片

#!/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。
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值