【问题标题】:/bin/sh privilege escalation code using a fake ls - why does this work?使用假 ls 的 /bin/sh 权限提升代码 - 为什么会这样?
【发布时间】: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,这怎么可能?

感谢您的帮助!

【问题讨论】:

    标签: linux shell security sh


    【解决方案1】:

    这篇文章包含几个关于 shell 脚本的错误和基本误解:

    1. 关于额外的root,您是对的,这可能是复制粘贴错误。
    2. 关于缺少可执行权限的说法是正确的。作者没有测试自己的代码。
    3. 整个方法在 CentOS 或 macOS 等非基于 Debian 的系统上失败,其中 sh 是 bash,因为 bash 丢弃了 suid。
    4. 作者声称ls -l $name 其中name='. ; /bin/rm -Rf /' 将执行rm。这是错误的。
    5. 作者似乎进一步声称ls -l "$name" 其中name='. `/bin/rm -Rf /`' 将执行该命令。这也是错误的。

    我建议对整篇文章持保留态度。

    【讨论】:

    • #3 可以用/tmp/.secretshell -p避免
    • 6.本文假设 root 在其 PATH 中具有 .(并且在 /bin 之前)。这将是非典型的,尤其是对于 root,而且对于任何人来说都是不好的做法,因为它可能导致执行与您打算执行的程序不同的程序。
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2015-07-07
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多