Notes of Laurel | 大雨将至

Summary of Misc

Word count: 2.5kReading time: 10 min
2019/08/09 Share

只要不动感情就是金刚芭比。


Magical Categories

check-in

网络与信息安全领域专项赛2019

题目只有一句话:I'm gamectf.com, I love TXT.

看到这东西的时候我一脸懵逼啊🙃这是个啥??试着去看了一下gamectf.com但是压根进不去,,后来有大兄弟跟我说这是DNS查询…

1
dig -t txt gamectf.com

直接就能看到flag- -

1566190854573

clemency

第三届上海市大学生网络安全大赛

给了flag.encclemency.bin。窝不会,好像是说把输出内容从9bit解码到8bit。

solution.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
f=open("./flag.enc","r")
flag_enc=f.read()
f.close()
flag=""
flag_enc_bin=""
c=0
for i in range(len(flag_enc)):
flag_enc_bin+=bin(ord(flag_enc[i]))[2:].rjust(8,"0")
len_enc_bin=len(flag_enc_bin)
#print flag_enc_bin
for i in range(len_enc_bin/9):
flag+=chr(int(flag_enc_bin[i*9:i*9+9],2))
print flag

flag{I_love_cLEMENCy,so_I_want_to_share_it_with_you}

Bubble

第二届广东省强网杯线上赛2017

http://wiki.yak.net/589

flag.enc:

1
xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx

solution.py:

1
2
3
4
5
from bubblepy import BubbleBabble

str='xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx'
Str=BubbleBabble()
print(Str.decode(str))

flag{Ev3ry7hing_i5_bubb13s}

要想会,先学会

将pcap打开,TCP没找到有用的信息,注意到ICMP,长度是变化的,有点奇怪 - -

1569396529742

solution.py:

1
2
3
4
5
6
7
a=[144,150,139,145,165,120,139,91,160,93,167,70]

for i in range(-50,50):
char = ''
for m in a:
char = char+ chr(m+i)
print(char)

flag{Na1v3}

Random

第二届广东省强网杯线上赛2017

题目给了encrypt.pyo和flag.enc两个文件,直接使用uncompyle6反编译encrypt.pyo文件:

1
uncompyle6 encrypt.pyo > encrypt.py

encrypt.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# uncompyle6 version 3.4.0
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.16+ (default, Sep 4 2019, 08:19:57)
# [GCC 9.2.1 20190827]
# Embedded file name: encrypt.py
# Compiled at: 2017-07-11 05:19:27
from random import randint
from math import floor, sqrt
_ = ''
__ = '_'
____ = [ ord(___) for ___ in __ ]
_____ = randint(65, max(____)) * 255
for ___ in range(len(__)):
_ += str(int(floor(float(_____ + ____[___]) / 2 + sqrt(_____ * ____[___])) % 255)) + ' '

print _
# okay decompiling encrypt.pyo

solution.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from random import randint
from math import floor, sqrt


ANSInum = [i for i in range(33,127)]
flagEnc=[208,140,149,236,189,77,193,104,202,184,97,236,148,202,244,199,77,122,113]
for k in range(65*255,127*255,255):
tmpDict={}
for i in range(len(ANSInum)):
tmpInt = int(floor(float(k + ANSInum[i]) / 2 + sqrt(k * ANSInum[i])) % 255)
tmpDict[tmpInt] = chr(ANSInum[i])
try:
flag=''.join([tmpDict[i] for i in flagEnc])
print 'flag{' + flag + '}'
except:
pass

flag{ThisRandomIsNotSafe}


Photo Steganography

亚瑟西

网络与信息安全领域专项赛2019

题目给了一个加密过的压缩包,看都没看直接爆破,全数字不对,那就全字母试试 - -

1566192095186

此外,直接用十六进制分析工具打开,文件最后就能看到password

1566192301577

解密后是一个图片,图片末尾有一堆看起来像是加密过的东东,但我不知道这是啥加密…

1566192792499

队友说那是ook,直接解密就是flag。但是我用ook解了半天也不行🙃后面我分析的时候才发现问题…当时我用的是UltraEdit,如果从右边的面板开始选择,那么第一排就只能选到4个点 - -

1566193159531

但是如果我从左边面板开始选择,那就能选到5个点 - -

1566193288204

正是因为比赛时我是从右边选择的,少了一个点,所以始终解不出来…

这是为撒子喃为撒子喃为撒子喃

现在来解密一下吧 - -

1566193435124

就能得到flag啦 - -

1566193462723

七代目

网络与信息安全领域专项赛2019

给的是一个gif图片,但是打不开,用十六进制看看,发现头部不对劲啊,是个PNG- -

1566193649345

那就改成GIF吧 - -

1566193689595

改好之后图片就能正常显示了。用Stegsolve看一下每一帧,但是都没啥特别的。看一下每一帧的时间片 - -

1566194113431

Look,第7帧和其他帧不一样,应该有猫腻,那就分离出来,然后切换一下通道看看 - -

1566194298963


Compression Packet

ReCreators

i春秋 第二届春秋欢乐赛

题目给了一个无后缀的文件,file看一下 - -

1566699077598

是虚拟机VMware创建的虚拟硬盘格式,后缀名应该是.vmdk。更改后缀名后解压,可以得到一个misc.mp4 - -

1566699217039

binwalk -e提取一下,在/_misc.mp4.extracted/word/document.xml中会看到三段可疑数字 - -

1569392766749

Editor打开,搜索一下344134,能看到全部的内容,是这三段数字拼接起来的 - -

1569392857633

把这段数字HexDecode两次,Base32解码三次,Base64解码两次,HexDecode一次,Base32解码一次,Base64解码两次,就是flag - -

1566700288923

CryMisc

i春秋 第二届春秋欢乐赛

这道题对我来说偏hard,因为我密码学学得不太好,而且没学过python,写脚本有点困难(啊我好菜啊)。

CryMisc.zip压缩包中有一个crypto.zip和一个jiami.pycrypto.zip是加密过的,里面有一个gogogo.zipjiami.py。所以题目的意思是CryMisc.zip中的jiami.py应该和crypto.zip中的jiami.py是一样的,利用这个条件就可以通过明文攻击得到crypto.zip压缩包的密码。

什么是明文攻击呢?

如果我们已经拥有加密的压缩包中的某一个文件,而同一个压缩包中的所有文件都是使用同一个密钥进行加密的,所以就可以通过这个已知文件去查找密钥。

常用的明文攻击软件有ARCHPR或者pkcrack。这里我用ARCHPR

先将jiami.py压缩成压缩包。

这里需要注意的是,需要使用WinRar进行压缩,并且类型必须是zip

如果使用360压缩的话,,解不粗来的,,

选择明文攻击,导入这两个压缩包之后点击开始。先进行搜索密钥,找到匹配的密钥后会进行攻击。我们在找到密钥的时候就可以停止了,然后点击确定导出解密的压缩包crypto_decrypted.zip- -

1566611818570

gogogo解压后是三个文件,AESencrypt.py内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# -*- coding:utf8 -*-
from Crypto.Cipher import AES

s=open('next.zip','rb').read()
BS=16
pad_len=BS-len(s)%BS
padding=chr(pad_len)*pad_len
s+=padding

key='我后来忘了'
n=0x48D6B5DAB6617F21B39AB2F7B14969A7337247CABB417B900AE1D986DB47D971
e=0x10001
m=long(key.encode('hex'),16)
c=pow(m,e,n)
c='0{:x}'.format(c).decode('hex')
with open('RSA.encrypt','wb') as f:
f.write(c)

obj=AES.new(key,AES.MODE_ECB)
with open('AES.encryt','wb') as f:
f.write(obj.encrypt(s))

意思就是RSA.encrypt是对key RSA加密后的内容,AES.encrypt中是先AES加密然后把key RSA加密的结果。

首先使用yafu将n分解得到pq,利用gmpy2可以解出d

1566634254708

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Cipher import AES
import gmpy2

c=long(open('RSA.encrypt','rb').read().encode('hex'),16)
n=0x48D6B5DAB6617F21B39AB2F7B14969A7337247CABB417B900AE1D986DB47D971
e=0x10001
p=185783328357334813222812664416930395483
q=177334994338425644535647498913444186659
d=gmpy2.invert(e,(p-1)*(q-1))
m=pow(c,d,n)
key='{:x}'.format(m).decode('hex')
print(key)
s=open('AES.encryt','rb').read()
obj=AES.new(key,AES.MODE_ECB)
s=obj.decrypt(s)
BS=16
pad_len=ord(s[-1])
s=s[:-1*pad_len]
with open('next.zip','web') as f:
f.write(s)

跑一下,可以得到keycopy_white_key,以及next.zipencrypt.py内容如下 - -

1
2
3
4
5
6
7
8
9
10
# -*- coding:utf8 -*-
from base64 import *

s=open('flag.jpg','rb').read()
s='-'.join(map(b16encode,list(s)))
s=map(''.join,zip(*(s.split('-'))))
with open('first','wb') as f:
f.write(b16decode(s[0]))
with open('second','wb') as f:
f.write(b16decode(s[1]))

它将flag.jpg拆成了两部分,分别使用了base16decode。所以我们将其合并:

1
2
3
4
5
6
7
8
9
10
11
from base64 import *

s=[0,1]
with open('first','rb') as f:
s[0]=b16encode(f.read())
with open('second','rb') as f:
s[1]=b16encode(f.read())
s=map(''.join,zip(*s))
s=b16decode(''.join(s))
with open('flag.jpg','wb') as f:
f.write(s)

还原出了flag.jpg

讲道理我还是觉得前面的过程好复杂…

对于这个flag.jpg呢,binwalk了一下 - -

1566637360803

放到010Editor里面愣是没找到哪里有藏东西,原来是藏了一个PSD文件 - -

1566637577938

将其导出然后用Photoshop打开 - -

1566637664082

这个flag当然是假的啦,你见过中文的flag吗???

还记得前面解出的key是copy_white_key吗…这里需要把背景图层拖出来,换一下通道,就会得到一张二维码,扫描就是flag了。☺

还是想说,这尼玛Crypto和Misc结合的题目都好难啊😭


Traffic Analysis

可恶的黑客

题目给了一个pcap流量包,用Wireshark打开。我先试着搜索了一下flag,然后看到有个flAg.txt(虽然没有什么卵用) - -

1566713297822

注意text data,这句话的内容是:我的支付宝账号(count打错了吧…)是blablabla,当你支付后,flag.txt会出现在这个菜刀里。看起来像是一个(英语不好的)黑客和用户在对话,那我们追踪一下TCP流看一下 - -

1566713568199

从第六条流开始,末尾就是双方对话的内容。

这个when my flag是认真的吗…1566713710554

在25流的时候,黑客告诉对方,去看hnt.txt - -1566713921793

去查找一下hnt.txt中的内容,看到了一串东西 - -

1566714006853

这是Unicode转义后的结果,我们只需要将其转回字符串就行了,Python大法好啊:

1
2
3
4
>>> import lxml.html
>>> a='f1ag{si11yb0yemmm}'
>>> lxml.html.fromstring(a).text
'f1ag{si11yb0yemmm}'

流量分析

第三届上海市大学生网络安全大赛

文件中包含了TCP,UDP,ICMPv6,DNS,TLS等协议,http对象不能导出。还是先搜索了一下字符串flag,发现了flag.txt和flag.zip等。然后追踪一下TCP流,在Stream38和Stream44分别有一个flag.zip,先导出来看看,都是加密的,把0900改成0000也不能打开。

Stream42的内容为 - -1566721858932

Steam55的内容为 - -1566721920678

有没有发现多了一个key.log哇,在Stream58 - -

1566722269144

点开协议首选项管理器 - -

1566722339549

给SSL协议导入刚才发现的key.log - -

1566722417378

这样一来,http对象可见了 - -

1566722526104

Packet8005的大小单位是kb,其他文件都是bytes,说明这个zip文件有东西,那就保存下来研究研究。解压之后是2.mp3。用Audacity打开看看,最后面那里看起来像是脱节的 - -

1566722660215

其实就算听一下也会发现,后面全是杂音。所以切换一下频谱图看看,啥都看不到 - -

1566722746046

为什么呢,因为拉得太高了,只显示了下面的…鼠标放在左边那里,缩小一点,就能看到key了 - -

1566722865977

拿这个key去解密之前的某个压缩包,就能得到flag。


CATALOG
  1. 1. Magical Categories
    1. 1.1. check-in
    2. 1.2. clemency
    3. 1.3. Bubble
    4. 1.4. 要想会,先学会
    5. 1.5. Random
  2. 2. Photo Steganography
    1. 2.1. 亚瑟西
    2. 2.2. 七代目
  3. 3. Compression Packet
    1. 3.1. ReCreators
    2. 3.2. CryMisc
  4. 4. Traffic Analysis
    1. 4.1. 可恶的黑客
    2. 4.2. 流量分析