出题的水平真的挺高的,好难……
目录
1.ezPythonCheckIn
第一个就是python的沙盒逃逸;
import atexit
import base64
import json
import os
import subprocess
from tempfile import NamedTemporaryFile
black_list = [
"nosec",
"import",
"load",
"''",
'""',
"[]",
"{}",
"().",
"builtins",
"dict",
"dir",
"locals",
"base",
"classes",
"+",
"mro",
"attribute",
"id",
]
def main():
print("Hello!")
print("Please send base64 encoded string!")
data = input("> ")
if len(data) > 1600:
print("Too long")
return
decode_data = base64.b64decode(data).decode()
print(decode_data)
if any(item in decode_data for item in black_list):
print("Not Safe")
return
with NamedTemporaryFile("wt", suffix=".py", delete=False, encoding="utf-8") as f:
f.write(decode_data)
temp_filename = f.name
atexit.register(os.remove, temp_filename)
print("step")
check_result = json.loads(
subprocess.run(
["bandit", "-r", temp_filename, "-f", "json"],
capture_output=True,
encoding="utf-8",
).stdout
)
if len(check_result["results"]) == 0:
print("[+] OK")
subprocess.run(["python3", temp_filename], timeout=60)
print("[+] Over")
else:
print("[+] Not Safe")
return
main()
这是沙盒的源码,发现黑名单过滤了很多东西,然后长度限制,还用了bandit过滤不安全的函数。然后把用户的输入都传到临时文件里。后来请教大佬方知有breakpoint()函数,作用是直接打开一个解释器首先breakpoint()绕过了黑名单,长度上ok,也通过了bandit的检测,然后传到临时文件里执行,跳出解释器,现在没什么东西可以限制我们了,直接_import_('os').system('ls')执行命令找flag然后返回flag就OK了
2.Cipher
这题多亏了一起做题的小伙伴的思路,只不过是站在他们的肩膀上拿的flag
题目给了一个vhd,挂载,发现了公用文件夹下flag,然后发现这个是加密的,无权限访问,查看属性,在压缩和加密属性那里点高级,发现了图片的权限所有者,还知道这个是EFS文件加密系
统加密的
然后EFS的加密原理是这样的,首先用FEK文件加密密钥对文件进行对称加密,然后把用RSA对FEK密钥加密,其中公钥用来加密,私钥用来解密,私钥又收到登陆密码保护,所以我们要有登陆密码解密私钥,私钥解密FEK,FEK解密文件,默认的RSA私钥在这里:C:\Users\mark\AppData\Roaming\Microsoft\Crypto\RSA然后找到私钥后就差登陆密码,这个可以在console_history(大概是这个名字)找到,然后丢尽AEFSDR这个软件就可以自动解密了,完成!