DDCTF-2018部分题writeup

打了好几天最后也只是80多名,我好菜啊.jpg

0x00  (╯°□°)╯︵ ┻━┻ 

题目:

(╯°□°)╯︵ ┻━┻

d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd

一开始被这个(╯°□°)╯︵ ┻━┻误导以为是jjencode,尝试了好久没啥结果,后面又有人说是翻转,试了很久还是没结果。然后跑了下移位密码获取flag

贴上脚本

 1 s='d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd'
 2 '''
 3 s1=''
 4 for x in range(len(s)/2):
 5     s1+=chr((int(s[x*2:x*2+2],16))%128)
 6 print s1
 7 '''
 8 
 9 for j in range(20):
10     s1=''
11     for x in range(len(s)/2):
12         s1+=chr((int(s[x*2:x*2+2],16)-j)%128)
13     print s1
14     

0x01 第四扩展FS

题目:D公司正在调查一起内部数据泄露事件,锁定嫌疑人小明,取证人员从小明手机中获取了一张图片引起了怀疑。这是一道送分题,提示已经在题目里,日常违规审计中频次有时候非常重要。 https://pan.baidu.com/s/1DJpMFU2lajHGTo0yfzTHVQ 密码:fpp4

这道题很多坑,拿到题目看题目名字就可以知道它考的是ext4文件,先用压缩软件打开查看了一下

因为没怎么接触过ext4文件系统所以不知道journal文件是拿来干嘛的,百度后说是文件系统日志,所以考虑mount到linux上,但是怎么都不成功。

另外还有一个加密的file.txt,用binwalk扫了下文件,发觉就是这两个文件

为了寻找file.txt密码,用winhex打开jpg后发现有些图片有敏感信息,然后直接查看图片属性,发现解压密码

解压打开file.txt

根据提示频率,统计一下字符出现频率,贴上脚本,得到flag

1 import collections
2 
3 f=open('file.txt','r')
4 print collections.Counter(f.read())

0x02 流量分析

题目:提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意补齐私钥格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----

这题给的数据包很大,而且有很多坑,数据包前面有两个用ftp传输加密压缩文件fl-g.zip,sqlmap-dev.zip,中间有九封邮件,只到看到最后才会发现本题关键ssl加密通信。

 前面的两个压缩包可能是本题彩蛋,不过我是真的解不出来。。。所以跳过,直接导出邮件。

将导出的邮件导入qq邮箱中查看,可以发现这个

这里是本题关键,在数据包中这里是很大一串base64,解密后得到rsa私钥

,将私钥识别补齐格式进行ssl解密得到

 

0x03 安全通信

题目:请通过nc XXXX.XXXX.XXXX.XXXX XXXX答题,mission keyb9ba15b341c847c8beba85273f9b7f90agent id随意填就可以

 1 #!/usr/bin/env python
 2 import sys
 3 import json
 4 from Crypto.Cipher import AES
 5 from Crypto import Random
 6 
 7 
 8 def get_padding(rawstr):
 9     remainder = len(rawstr) % 16
10     if remainder != 0:
11         return '\x00' * (16 - remainder)
12     return ''
13 
14 
15 def aes_encrypt(key, plaintext):
16     plaintext += get_padding(plaintext)
17     aes = AES.new(key, AES.MODE_ECB)
18     cipher_text = aes.encrypt(plaintext).encode('hex')
19     return cipher_text
20 
21 
22 def generate_hello(key, name, flag):
23     message = "Connection for mission: {}, your mission's flag is: {}".format(name, flag)
24     return aes_encrypt(key, message)
25 
26 
27 def get_input():
28     return raw_input()
29 
30 
31 def print_output(message):
32     print(message)
33     sys.stdout.flush()
34 
35 
36 def handle():
37     print_output("Please enter mission key:")
38     mission_key = get_input().rstrip()
39 
40     print_output("Please enter your Agent ID to secure communications:")
41     agentid = get_input().rstrip()
42     rnd = Random.new()
43     session_key = rnd.read(16)
44 
45     flag = '<secret>'
46     print_output(generate_hello(session_key, agentid, flag))
47     while True:
48         print_output("Please send some messages to be encrypted, 'quit' to exit:")
49         msg = get_input().rstrip()
50         if msg == 'quit':
51             print_output("Bye!")
52             break
53         enc = aes_encrypt(session_key, msg)
54         print_output(enc)
55 
56 
57 if __name__ == "__main__":
58     handle()

分析代码得知,该题为aes  ecb加密,这几天密码学课刚好讲到这,ecb是一种非常不安全的加密,wiki上有很好的举例。这里讲一下方法,因为我是一位一位爆破的没写出一键的脚本。

1.本题通过输入agent_id,构造形如

Connection for mission: {agent_id}, your mission's flag is: DDCTF{32位}的字符串,

用随机生成的16位密钥进行加密,在一次连接中密钥不会变换

2.因为aes的特性通过改变输入agent_id长度,可以确定flag长度为32位,如下图

3.因为aes特性将字符串16位一组分组,当输入12345678时,字符串多出一位},分析脚本得知会用0补齐。

4.aes_ecb的特性,最后一组的}和单独输入}加密后一样,得知可以进行爆破,通过改变agent_id长度进行爆破。得到flag

猜你喜欢

转载自www.cnblogs.com/kagari/p/8889412.html