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。