【发布时间】:2019-07-16 19:28:53
【问题描述】:
我最近在以下网站上发现了这个 sn-p:
https://www.linuxjournal.com/content/writing-secure-shell-scripts
这是脚本:
#!/bin/sh
if [ "$USER" = "root" ] ; then
/bin/cp /bin/sh /tmp/.secretshell
/bin/chown root /tmp/.secretshell
/bin/chmod 4666 root /tmp/.secretshell
fi
exec /bin/ls $*
假设运行此代码的人对系统具有低级访问权限(即他们可以写信给/tmp/),并且系统没有“加固”。
在上面的链接中,代码的作者说,“这个简单的小脚本创建了一个 shell,它始终授予其用户 root 访问 Linux 系统的权限。”
这个想法是攻击者将编写上面的脚本,将其命名为ls,并将其放在系统上的/tmp/ 目录中。因此,在/tmp/ 中运行ls(而不是/bin/ls)的任何用户都会无意中运行此脚本。如果运行ls 的用户恰好是root,他/她将触发封闭if/fi 块中的(恶意)代码。为了隐藏发生了任何有害的事情,由于最后的exec /bin/ls $* 行,用户想要的目录列表仍将按预期执行。
我不太明白if/fi 块的最后一行在做什么。这就是我解释if/fi 块的前两行的方式:
在/bin/cp /bin/sh /tmp/.secretshell 行中,脚本将/bin/sh 二进制文件复制到/tmp/,并将其重命名为.secretshell,这是一个隐藏文件。好的好的。
在/bin/chown root /tmp/.secretshell 行中,脚本将.secretshell 的所有者更改为root。好的好的。
我不太明白的是/bin/chmod 4666 root /tmp/.secretshell 这一行。据我所知,我认为这条线旨在为.secretshell 翻转setuid 位,以便每次运行.secretshell 时,它都以其所有者身份运行(现在是root)。这将(我想)让运行.secretshell 的任何人都能够以root 运行sh。但这里有两件事似乎有问题:
1) 当chmod 在权限参数之后需要一个目录或文件名时,如何将root 作为第二个参数插入/bin/chmod?
2) 权限参数的*666 部分不是通过将其权限掩码转换为-rwSrw-rw- 来使.secretshell 不可执行吗?如果意图是执行 .secretshell,这怎么可能?
感谢您的帮助!
【问题讨论】: