Linux 提权基础:用户权限与信息收集

Linux 提权基础:用户权限与信息收集

前言

信息收集是渗透测试还是内网攻防,提权都扮演着 “承上启下” 的核心角色

  • 对渗透测试:没有提权,测试结果仅能覆盖 “表层漏洞”,无法全面评估系统风险;
  • 对真实攻防:没有提权,攻击者只能停留在 “初始访问点”,无法深入内网、控制核心资产。

简言之,提权的本质是突破权限限制,将 “有限访问能力” 转化为 “深度控制能力” —— 它是连接 “初始 foothold(立足点)” 与 “核心目标” 的唯一路径,也是评估防御体系有效性、实现攻防对抗目标的关键环节。

一、Linux 用户和组

用户组是 Linux 系统权限管理的核心载体,既方便用户间共享文件,也让管理员可通过“组权限分配”替代“单个用户授权”,提升管理效率。

Linux 用户按权限和用途分为三类,且每个用户必须归属至少一个组(无法独立于组存在);用户组的核心信息存储于 /etc/group 文件中,可通过 cat /etc/group 查看。

用户类型 UID 范围 核心权限与用途 Windows 类比对象
系统管理员 0(仅 root 账户) 拥有系统全部权限,可执行任意操作(如修改系统配置、删除核心文件),是系统的“所有者” Administrator 账户
系统用户 CentOS 6:1-499;CentOS 7:1-999 系统内建账号,用于运行服务(如 sshd、nginx),禁止交互登录 System 账户(权限低于 System)
自定义用户 CentOS 6:500+;CentOS 7:1000+ 由 root 创建的普通登录账户,用于日常操作,权限受限于 UID 和文件权限 Users 组内账户

二、核心配置文件解析

2.1 /etc/passwd 文件

/etc/passwd 是 Linux 存储用户基本属性的核心文件,每个用户对应一行记录,管理员可通过修改该文件完成基础用户管理。

文件格式(字段含义)

1
用户名:密码占位符:用户ID(UID):组ID(GID):用户说明:家目录:登录后默认Shell

注:“密码占位符”为 x,表示密码已加密存储于 /etc/shadow(避免明文泄露),早期系统曾直接存储密码哈希。

登录后的 Shell

在 CentOS 7 中,用户登录后的 Shell 权限 由两部分决定:

  1. /etc/passwd 中指定的 Shell 类型(如 bashnologin),直接决定“能否交互登录”“能否执行命令”;
  2. 用户的 UID/GID 及文件系统权限(r/w/x),决定“操作的权限范围”(如普通用户 vs root)。
1. 核心概念:Shell 与登录权限的关系

Shell 是用户与系统内核交互的“桥梁”,不同类型的 Shell 对应完全不同的登录/操作能力。通过以下命令可查看用户默认 Shell:

1
2
3
4
5
# 查看 root 用户的默认 Shell(通常为 bash)
grep root /etc/passwd # 输出示例:root:x:0:0:root:/root:/bin/bash

# 查看 nginx 服务用户的默认 Shell(通常为 nologin)
grep nginx /etc/passwd # 输出示例:nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
2. 常见 Shell 类型对比表
权限分类 Shell 路径 核心权限与特点 典型使用场景
交互登录 Shell 允许 SSH/控制台登录,支持命令行交互(tab 补全、历史记录、脚本执行),是普通用户的默认选择 普通用户日常操作、管理员登录管理服务器
/bin/bash /bin/bash CentOS 7 默认 Shell,支持所有交互功能(别名、管道/重定向、环境变量继承) 99% 普通用户和 root 的默认 Shell,适合日常操作与脚本开发
/bin/sh /bin/sh POSIX 标准轻量 Shell,CentOS 7 中是 bash 的软链接(功能略简化) 执行 POSIX 标准脚本,兼容其他类 Unix 系统
受限交互 Shell 允许登录,但限制核心操作(如禁止切换目录、修改 PATH),降低风险 临时给第三方用户提供有限权限,防止误操作或越权
/bin/rbash /bin/rbash bash 受限模式:禁止 cd 切换目录、禁止执行绝对路径命令(如 /usr/bin/ls 给运维助手提供“仅在当前目录执行有限命令”的权限
无登录权限 Shell 禁止交互登录(SSH/控制台登录直接拒绝),仅允许特定场景执行命令 系统服务用户(如 nginx、mysql),防止恶意登录篡改配置
/sbin/nologin /sbin/nologin 1. 登录时提示“此账户无法登录”后退出;
2. 允许通过 su -s 临时切换为交互 Shell;
3. 支持运行服务进程
服务用户(nginx、mysql),仅用于运行服务,不允许人登录
/bin/false /bin/false 1. 比 nologin 更严格:无登录提示,直接拒绝;
2. 本质是“空 Shell”,无法执行任何命令;
3. 仅用于“占位”
完全禁用的废弃账户、无需执行命令的“伪用户”
/bin/dash /bin/dash 轻量 POSIX Shell,高效但无别名/历史记录,CentOS 7 不默认使用 执行简单系统脚本(如初始化脚本),不适合交互登录
3. 关键权限场景说明
场景 1:nologin 用户的“特殊权限”(禁止登录但允许运行服务)

/sbin/nologin 是服务用户的默认 Shell,核心特性:

  • 禁止交互登录:尝试 ssh nginx@服务器IP 会直接提示“此账户无法登录”并断开;
  • 允许运行服务进程nginx 用户的 UID 拥有读取配置文件(/etc/nginx/)、写入日志(/var/log/nginx/)的权限(由文件组权限 r-x 控制);
  • 临时切换需 root 权限:管理员若需操作 nginx 用户,需通过以下命令:
    1
    2
    # 临时切换为 nginx 用户的 bash Shell(仅 root 可执行)
    su -s /bin/bash nginx # 切换后进入 nginx 家目录 /var/lib/nginx,权限受限于 nginx 的 UID
场景 2:root 用户的 Shell 权限(不受限的“超级权限”)

root 的默认 Shell 是 /bin/bash,其权限本质来自 UID=0(Linux 中 UID=0 即超级用户),而非 Shell 类型:

  • 可执行所有命令(如 rm -rf /chmod 777),不受文件权限限制;
  • 可无密码切换到任何用户:su - 用户名su -s /bin/bash 用户名
  • 可修改任意用户的默认 Shell:chsh -s /bin/bash 用户名(修改后需重新登录生效)。
场景 3:普通用户的 Shell 限制(受 UID 和文件权限约束)

普通用户(UID≥1000)默认 Shell 为 /bin/bash,但权限受限:

  • 仅能修改自身家目录(/home/用户名)及有读写权限的文件;
  • 执行 sudo 命令需提前在 /etc/sudoers 中配置(否则无法执行 root 级命令);
  • 无法切换到 nologin/false 用户(除非有 sudo 权限)。
4. 常用 Shell 管理命令(实操)

echo $SHELL

将 test 用户的默认 Shell 改为 nologin


小结
  • 正常交互需求(日常操作):用 /bin/bash
  • 限制操作需求(临时账户):用 /bin/rbash
  • 禁止登录需求(服务账户):用 /sbin/nologin
  • 完全禁用需求(废弃账户):用 /bin/false

2.2 /etc/shadow 文件

/etc/shadow 是 Linux 存储 用户加密密码及账号安全信息 的核心文件,是 /etc/passwd 的安全扩展(仅 root 可读写,避免普通用户获取密码哈希)。

文件格式(字段含义)

1
用户名:加密密码:密码最后修改日期:密码修改间隔:密码有效期:到期警告天数:过期宽限天数:账号失效时间:保留字段

注:“密码最后修改日期”以“1970-01-01 至今的天数”计算,可通过 date -d "1970-01-01 + 天数 days" 转换为日期格式。

加密密码格式详解

加密密码字段的固定格式为:$id$salt$encrypted,三部分分别代表:

  • id:加密算法标识(1=MD5,5=SHA-256,6=SHA-512,CentOS 7 默认用 6);
  • salt:系统随机生成的盐值(防止相同密码生成相同哈希,对抗彩虹表攻击);
  • encrypted:盐值 + 明文密码的哈希结果。

三、Linux 文件权限

Linux 中“一切皆文件”(普通文件、目录、设备、套接字等),文件权限通过 r(读)、w(写)、x(执行)三种标志控制,不同类型文件的权限含义略有差异。

3.1 权限查看命令

通过 ls -l 查看普通文件权限,ls -la 查看包含隐藏文件的所有权限:

1
ls -l

3.2 权限字段解析(以 -rwxr-xr-x. 1 root root 为例)

字段位置 符号/数值 含义解释
第 1 位 -/d/l 文件类型标识:
-=普通文件,d=目录,l=软链接,b=块设备,c=字符设备
第 2-4 位 rwx 文件所有者权限(user):读(r)、写(w)、执行(x)
第 5-7 位 r-x 文件所属组权限(group):读(r)、无写(-)、执行(x)
第 8-10 位 r-x 其他组用户权限(other):读(r)、无写(-)、执行(x)
第 11 位 . SELinux 安全上下文标识(若为 + 表示有 ACL 权限)
第 12 位 1 硬链接数/子目录数:
- 普通文件:硬链接个数;
- 目录:子目录个数(含 ...
第 13-17 位 root root 所有者与所属组:
第一个 root=文件所有者,第二个 root=文件所属组

3.3 目录权限的特殊说明

目录的 r/w/x 权限含义与普通文件不同:

  • r:允许查看目录下的文件列表(如 ls 命令);
  • w:允许在目录内添加、删除、重命名文件(需配合 x 权限);
  • x:允许进入目录(如 cd 命令),x 权限时,即使有 w 权限也无法写入文件

四、Linux 特殊权限

除常规 rwx 权限外,Linux 还有三种特殊权限(SUID、SGID、SBIT),用于控制程序或目录的“特殊操作能力”。

权限名称 标识符号 作用对象 核心功能 典型示例
SUID s(所有者 x 位) 可执行文件 执行文件时,临时赋予执行者“文件所有者”的权限(而非执行者自身权限) passwd 命令(所有者为 root,普通用户执行时临时获得 root 权限修改 /etc/shadow
SGID s(所属组 x 位) 可执行文件/目录 1. 对文件:执行时临时获得“文件所属组”权限;
2. 对目录:新创建的文件自动继承目录的所属组
共享目录(如 /var/www),所有用户在该目录创建的文件均归属 www
SBIT t(其他组 x 位) 目录 仅文件所有者或 root 可删除/修改目录下的文件(防止其他用户删除他人文件) /tmp 目录(所有用户可读写,但仅自己能删除自己的临时文件)

五、提权前置:信息收集命令集

信息收集是提权的基础,需优先获取系统、用户、权限等核心信息,以下为常用命令分类整理。

5.1 系统基础信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看完整系统信息(内核版本、主机名、架构、系统时间等)
uname -a

# 仅查看内核版本
uname -r

# 查看系统主机名
uname -n

# 查看系统内核架构(64位=x86_64,32位=i686)
uname -m

# 查看内核详细信息(含编译时间、GCC 版本)
cat /proc/version

# 查看系统分发版本(如 CentOS 7.9、Ubuntu 20.04)
cat /etc/*-release

# 查看 CPU 信息(核心数、型号、架构)
cat /proc/cpuinfo

5.2 用户与组信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看所有用户的基本属性(UID、GID、Shell 等)
cat /etc/passwd

# 查看 root 用户的本地邮件(可能包含系统通知、错误日志)
cat /var/mail/root
cat /var/spool/mail/root

# 查看所有用户组的信息(GID、成员列表)
cat /etc/group

# 列出所有超级用户账户(UID=0,可能存在非 root 的隐藏管理员)
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1 }'

# 查看当前登录的用户名
whoami

# 查看当前已登录用户的活动(终端、登录时间、执行命令)
w

# 查看最近登录的用户列表(含登录时间、IP 地址)
last

# 查看所有用户的上次登录信息
lastlog

# 查看指定用户的上次登录信息(替换“用户名”为目标用户)
lastlog -u 用户名

5.3 查找明文密码

1
2
3
4
5
6
7
8
9
10
11
# 在指定文件中查找包含“user”的行(不区分大小写)
grep -i user [filename]

# 在指定文件中查找包含“pass”的行(不区分大小写,覆盖 password、passwd 等)
grep -i pass [filename]

# 在指定文件中查找“password”,并显示匹配行的上下 5 行内容(上下文)
grep -C 5 "password" [filename]

# 递归查找当前目录及子目录中所有 .php 文件,匹配“var $password”并显示行号
find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

5.4 SSH 密钥信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看当前用户的 SSH 授权密钥(允许免密登录的公钥列表)
cat ~/.ssh/authorized_keys

# 查看当前用户的 SSH 身份密钥(旧版 RSA 私钥/公钥)
cat ~/.ssh/identity
cat ~/.ssh/identity.pub

# 查看当前用户的 RSA 私钥/公钥(常用)
cat ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub

# 查看当前用户的 DSA 私钥/公钥(较少用)
cat ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub

# 查看 SSH 客户端配置(默认连接参数、主机别名等)
cat /etc/ssh/ssh_config

# 查看 SSH 服务端配置(端口、登录限制、密钥文件路径等)
cat /etc/ssh/sshd_config

# 查看 SSH 服务端的主机密钥(私钥/公钥,用于客户端验证服务器身份)
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_key
cat /etc/ssh/ssh_host_key.pub