专栏名称: CTFer的魔法棒
CTFer的魔法棒,你的CTF参赛指南。 查看比赛日程、学习竞赛相关知识应有尽有
目录
相关文章推荐
财宝宝  ·  发小视频,我们给你点赞,@来去之间 ... ·  2 天前  
财宝宝  ·  我的心头好 -20250210220614 ·  3 天前  
51好读  ›  专栏  ›  CTFer的魔法棒

红帽杯初赛writeup-上

CTFer的魔法棒  · 公众号  ·  · 2018-05-03 19:17

正文

大赛简介:第二届红帽杯网络安全攻防大赛由广东省公安厅、共青团广东省委员会、广东省教育厅指导,由广东省计算机信息网络安全协会主办,华南理工大学承办,永信至诚提供技术支撑。大赛是面向全省政府机关、企事业单位、以及高等院校和信息安全企业的一次网络安全赛事,比赛秉持“以赛促学,边赛边学”的宗旨,邀请党政机关、企事业单位、全日制高校在校生、网络安全企业技术人员集聚一堂,共同探索网络安全人才培养新模式。


初赛 采取线上竞赛方式。各参赛队登录(输入i春秋比赛平台网址),完成大赛指定的题目。决赛基于报名结构比例,选拔35支来自高校、14支来自政府国企事业单位、11支来自安全企业的优秀队伍。初赛的成绩不带入决赛。

决赛 采取线下竞赛方式,赛场设在广州塔广州海珠区阅江西路222号(东登塔口入)。竞赛模式是攻防对战(AWD),考察团队实力,借以发掘优秀人才。



MISC

签到

加入2018redhat初赛交流群(218891597),在管理员处找到

得到flag{redhat_welcome}


Not Only Wireshark


把文件名改名为x.pcapng,然后在命令行使用tshark

tshark -r x.pcapng -e http.request.uri -Tfields -Y 'http.request.uri' | grep -P 'name=[A-F0-9]{3}' | awk -F '=' '{printf$2}'

得到

123404B03040A0001080000739C8C4B7B36E495200000001400000004000000666C616781CD460EB62015168D9E64B06FC1712365FDE5F987916DD8A52416E83FDE98FB504B01023F000A0001080000739C8C4B7B36E4952000000014000000040024000000000000002000000000000000666C61670A00200000000000010018000DB39B543D73D301A1ED91543D73D301F99066543D73D301504B0506000000000100010056000000420000000000

这里1234后面补上5,就得到常见的zip头504B,把504B开始的字符串以16进制来保存为zip包,解压密码为流量里找到的key=?id=1128%23,也就是?id=1128%23为解压密码。


听说你们喜欢手工爆破

解压iso文件, 得到情系海边之城.rar和一堆文件。



每个文件里都是一个base64干扰字符串,不用读取所有文件值了。重点在于不同的文件名。

2、编写代码提取所有文件名,做为爆破字典。

代码如下:

#-*- coding: utf-8 -*-

importos

names= os.listdir('/Users/Ledon/Desktop/misc_txt_file')

i=0

#i 用于统计文件数量

f =open('password.txt','w')

forfilename in names:

index = filename.rfind('.')

#    print(index)

name = filename[:index]

f.write(name+'\n')

i=i+1

print(i)

得到如图所示结果:


进行爆破操作,得到rar包的密码:0328fc8b43cb2ddf89ba69fa5e6dbc05

利用工具:Advanced Archive Password Recovery

3、得到了一个doc加密文档,由经验可知,doc密码可移除,https://blog.csdn.net/lddongyu/article/details/1587319,这是Office漏洞的一个例子。

这里我们使用:Accent OFFICE Password Recovery v5.1进行密码爆破:

得到密码为5693

之后得到一长段文字


情系海边之城又名海边的曼彻斯特,https://movie.douban.com/subject/25980443/

由计算机网络知识可知,有曼彻斯特编码与差分曼彻斯特编码。

编写代码实现解密:

n=0x123654AAA678876303555111AAA77611A321

flag=''

bs='0'+bin(n)[2:]

r=''

defconv(s):

return hex(int(s,2))[2:]

fori in range(0,len(bs),2):

if bs[i:i+2]=='01':

r+='0'

else:

r+='1'

fori in range(0,len(r),8):

tmp=r[i:i+8][::-1]

flag+=conv(tmp[:4])

flag+=conv(tmp[4:])

print("flag"+"{"+flag.upper()+"}")

有两个结果:

产生原因是因为对于电平调变的定义不同导致的

这里根据,

可确定结果。

最终得到flag:flag{5EFCF5F507AA5FAD77}



这是道web题?

1、找出webshell

可以使用D盾或者是自己的脚本进行webshell检测,题目告知这是道web题作为提示。

附检测脚本代码段:#S为特征list

def calculate(self, data, filename):

if not data:

return "", 0

# Lots taken from the wonderful post athttp://stackoverflow.com/questions/3115559/exploitable-php-functions

for i in S:

jihe = set()

valid_regex = re.compile(i,re.I)

matches = re.findall(valid_regex, data)

for n in matches:

jihe.add(n)

self.results.append({"filename":filename, "value":len(matches),"feature":list(jihe)})

return len(matches)

return 0

def sort(self):

self.results.sort(key=lambda item: item["value"])

self.results.reverse()

self.results = resultsAddRank(self.results)

def printer(self, count):

"""Print the top signaturecount match files for a given search"""

print "\n[[ Top %i signature match counts ]]" % (count)

if (count > len(self.results)): count = len(self.results)

for x in range(count):

if(self.results[x]["value"]> 0):

找到webshell文件为:


对于那些想投机取巧用文件比对做的同学,或者是修改时间啊。那也是不可能的,源码改了很多处。

重点是下面的 tip


tshark做流量记录,那么就要找pcap包。可是找到了一堆pcap包,挨个使用tshark进行分析提取:(加了很多虚假流量包防单个审计)

tshark -ryunCMS/yuncms/libs/classes/78466550-3fc1-11e8-9828-32001505e920.pcapng -Y'http.host and http.request.uri' -e http.host -e http.request.uri -T fields -Eheader=y>icq1.js

由之前的upload提示可知为上传漏洞,那么这个包传的webshell,除此之外,还有上传的upload/url,那么这个包就是有问题的包。进行包分析,找到上传图片的记录。

提取出232.jpg,分离出sorry动图。

发现没东西,再看看里面藏没藏东西。




然后使用ps打开,一帧帧得看,得到编码前的flag,解码后得到flag。

最终得到flag:flag{S022y4orr5}


问卷

把问卷做完后,会得到一个flag:

flag{我们在广州塔等着你}

Crypto

3dlight

1. 题目首先将`flag`进行随机`pad`,之后进行简单移位,最后通过映射到三维空间并根据题目描述规则进行加密。

2. 由于被加密字符串为`shuffle(flag+ pad)`,最后长度为512bit,因此爆破无法解决。

3. 考虑题目描述,`shuffle_flag`每一位只会影响曼哈顿距离`d< p`的点,其中`p = 2`,因此可以构造512个变量的方程。(难点)

4. 方程可以通过高斯消元进行求解,同样可以通过Z3进行求解。(难点)

5. 解出`shuffle_flag`之后进行移位即可得到`flag`。

rsa system

1. 题目给出一组`RSA`公钥,明文`pad`、`unpad`方法和签名方法。其中`pad`方法中除了填充之外还有变换,防止一些非预期解。

2. 对`RSA`公钥分析,发现不能得到`n`的分解。同时由于`flag`长度为38,同样也无法暴力破解。

3. 因此,突破口就在签名机制。然而,只进行简单签名是无法泄露`flag`。

4. 但是发现当我们输入的签名内容加上`flag`的长度恰好为`256`时,`pad`不会进行填充,但`unpad`操作仍会解除填充,因此我们能控制解除填充时截取的长度。(难点)

5. 通过签名进行截取长度从`1`到`len(flag)`的`flag`加密并得到密文,通过逐`Byte`枚举`flag`计算密文与从服务器得到的密文进行对比,进而得到`flag`。

advanced ecc

1. 题目考察`ECC`加密算法,并给出一条椭圆曲线描述,发现参数是比特币系统选用的secp256k1中的参数。

2. 题目模拟`ECC加密 + 对称加密`的加密通信算法,其中`对称加密`很简单只有异或操作,`ECC加密`也是标准加密方式,但根据选择随机数的数量多少提供三种安全级别的加密。已知的变量是公钥`(G, K)`,其中`G`是`base point`,`K`是私钥`k`与`G`的乘积即`K = kG`。未知的变量是私钥`k`,发送方产生的三个随机数`r1, r2, r3`,以及对称加密密钥`M`。并且通过选项能得到发送方发送的包含`flag`信息的密文`(C1, C2)`。

3. level 1加密密文`C1 = M + r1K, C2= r1G`,level 2加密密文`C1' = M + (r1 + r2)K, C2' = (r1 + r2)G`,level 1加密密文`C1'' = M+ (r1 + r2 + r3)K, C2'' = (r1 + r2 + r3)G`。因此

```

K = kG => rK = rkG

=> M + rK = M + rkG

=> C1 = kC2 + M

=> M = C1 - kC2

```

3. 密文的密钥`M`可以通过`ECC`解密公式`M = C1 -kC2`解密得到,但是`k`我们无法通过爆破得到。

4. 我们在脚本中发现`abs(r1 - r2)<= (1 << 20)`, `abs(r1 - r3) <= (1 << 20)`, `abs(r2 - r3)<= (1 << 20)`通过构造

```

C2 + C2' - C2''

= r1G + (r1 + r2)G - (r1 + r2 + r3)G

= (r1 - r3)G

```

而我们知道`G`以及`abs(r1 - r3) <= (1 << 20)`,因此可以通过枚举得到`r1 - r3`准确值。(难点)

5. 再次构造

```

C1 + C1' - C1''

= M + r1kG + M + (r1 + r2)kG - (M + (r1 +r2 + r3)kG)

= M + (r1 - r3)G

=> M = C1 + C1' - C1'' - (r1 - r3)G

```

由于我们知道`r1 - r3`,并且知道`G`,因此我们能够求出`对称加密`密钥`M`,从而得到`flag`。

Reverse

icm

使用IDA分析程序

经过分析程序使用IDEA算法


找到key的生成


找到数据


编写解密脚本,脚本如下:

import os,sys

defmakehex(value, size = 4):

temp = hex(value)[2:]

if temp[-1] == 'L': temp= temp[:-1]

return temp.zfill(size)

def add(a,b):

return (a + b) % (2**16)

defmult(value1,value2):

if value1 == 0:

value1 = 65536

if value2 == 0:

value2 = 65536

value1 = (value1*value2) % 65537

if value1 == 65536:

value1 = 0;

return value1

def invmod(b):

a=65537

x = 0 ; lastx = 1

y = 1 ; lasty = 0

while b != 0:

quotient = a / b

temp = b

b = a % b

a = temp

temp = x

x = lastx-quotient*x

lastx = temp

temp = y

y = lasty-quotient*y

lasty = temp

while lasty<0:

lasty += 65537

return lasty

deftwo_comp(a):

return (a^0xffff) + 1

defkeygen(key, mode):

temp =[]

for x in range(7):

for y in range(8):

temp += [key[4*y:4*y+4]]

key = bin(int(key,16))[2:]

while len(key)<128:

key = '0'+key

key =makehex(int(key[25:]+key[0:25],2),32)

temp = temp[0:52]

key = [int(x,16) for x in temp]

key =[key[0:6],key[6:12],key[12:18],key[18:24],key[24:30],key[30:36],key[36:42],key[42:48],key[48:52]]

if mode == 'd':

temp =[]

for x in range(8):

for y in range(6):

temp += [key[x][y]]

temp += [key[8][0],key[8][1],key[8][2],key[8][3]]

key = []

for x in range(8):

key += [invmod(temp[48-6*x]),

two_comp(temp[50-6*x]),

two_comp(temp[49-6*x]),

invmod(temp[51-6*x]),

temp[46-6*x],

temp[47-6*x]

]

key += [invmod(temp[0]),two_comp(temp[1]),two_comp(temp[2]),invmod(temp[3])]

key =[key[0:6],key[6:12],key[12:18],key[18:24],key[24:30],key[30:36],key[36:42],key[42:48],key[48:]]

t = key[0][2]

key[0][2] = key[0][1]

key[0][1] = t

return key

def IDEA(data,key, mode):

key = keygen(key,mode)

times = len(data)/16

ctext = ''

for r in range(times):

input = data[16*r:16*(r+1)]

x1 = int(input[:4],16)

x2 = int(input[4:8],16)

x3 = int(input[8:12],16)

x4 = int(input[12:],16)

for x in range(8):

t1 = mult(x1,key[x][0])

t2 = add(x2,key[x][1])

t3 = add(x3,key[x][2])

t4 = mult(x4,key[x][3])

t5 = t1^t3

t6 = t2^t4

t7 = mult(t5,key[x][4])

t8 = add(t6,t7)

t9 = mult(t8,key[x][5])







请到「今天看啥」查看全文