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