一.题目详情
链接:https://adworld.xctf.org.cn/challenges/list
二.解题思路
1.点击下载附件到桌面上,发现该文件没有后缀名
2.把文件拖进kali里面看看(或者用01editor查看文件头),可以发现该文件是一个压缩包
3.解压文件,发现里面藏了个流量包
第一思路通过看看用binwalk分析文件看看有什么隐藏东西
发现貌似藏了个rar文件,用binwalk -e 分离文件看看
出来了个rar文件,其中藏着我们所要的flag.txt
发现需要密码才能解压缩。
那就得返回去分析流量包,看看有没有藏密码之类的
4.分析流量包
打开wireshark,分析流量包
点击统计--协议分级,可以发现tcp流量包占大多数
通过搜索行输入tcp contains "flag"进行过滤流量包,发现有四条流量包符合
通过追踪流看看,是否有我们所需要的密码
前两条流量包明显是发送flag.rar这个压缩包的,我们直接追踪后面两条看看
发现其中有发送rar压缩包,和查看22文件夹内容,22文件夹有一段类似于base64编码加密的密文
先把这段base64编码保存下来
19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo=
继续查看,发现后面有一段AES加密
python代码:
# coding:utf-8
__author__ = 'YFP'
from Crypto import Random
from Crypto.Cipher import AES
import sys
import base64
IV = 'QWERTYUIOPASDFGH'
def decrypt(encrypted):
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.decrypt(encrypted)
def encrypt(message):
length = 16
count = len(message)
padding = length - (count % length)
message = message + '\0' * padding
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.encrypt(message)
str = 'this is a test'
example = encrypt(str)
print(decrypt(example))
分析代码:该代码传进一个字符串进行aes加密解密,而且还调用了base64这个库,在联合我们之前获得的base64编码,猜测应该需要把我们获得的base64编码密文进行base64解密后,在进行aes解密就可以获得解压文件的密码了
开始尝试修改代码:
python:
# coding:utf-8
__author__ = 'YFP'
from Crypto import Random
from Crypto.Cipher import AES
import sys
import base64
IV = 'QWERTYUIOPASDFGH'
def decrypt(encrypted):
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.decrypt(encrypted)
def encrypt(message):
length = 16
count = len(message)
padding = length - (count % length)
message = message + '\0' * padding
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.encrypt(message)
s='19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo='
flag=base64.b64decode(s)
print(decrypt(flag))
在pycharm运行,出现报错问题,进行分析发现该代码把字符型和字节型数据进行运算了,再进行修改,统一一下数据类型:
最终运行的python代码:
from Crypto.Cipher import AES
import base64
IV = b'QWERTYUIOPASDFGH' # IV 应该是字节型数据
def decrypt(encrypted):
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.decrypt(encrypted).rstrip(b'\0') # 移除填充的 '\0' 字节
def encrypt(message):
length = 16
count = len(message)
padding = length - (count % length)
message = message + b'\0' * padding # 将填充的字符串转换为字节型数据
aes = AES.new(IV, AES.MODE_CBC, IV)
return aes.encrypt(message)
s = '19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo='
flag = base64.b64decode(s)
print(decrypt(flag))
运行结果:
获得了解压文件的密码为passwd{No_One_Can_Decrypt_Me}
5.解压文件获取flag值
最终flag值为WDCTF{Seclab_CTF_2017}