/ bin / sh使用伪造的ls特权升级代码-为什么这样做有效?

时间:2019-07-16 19:28:53

标签: linux shell security sh

我最近在以下网站上遇到了此代码段:

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/),并且该系统未经过“强化”。

在上面的链接中,代码的作者说:“这个简单的小脚本创建了一个外壳,始终向其用户授予对Linux系统的根访问权限。”

这个想法是,攻击者将在上面编写脚本,将其命名为ls,然后将其放入系统的/tmp/目录中。因此,在ls中运行/bin/ls(而不是/tmp/)的任何用户都会无意中运行此脚本。如果运行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行。据我所知,我认为这一行旨在翻转setuid的{​​{1}}位,以便每次运行.secretshell时,它都以其所有者身份运行(现在是{{ 1}})。 (我想)这将使运行.secretshell的任何人都能够像root一样运行.secretshell。但是这里有两件事似乎有问题:

1)当sh在权限参数后需要目录或文件名时,如何将root作为root的第二个参数插入?

2)权限参数的/bin/chmod部分不是通过将其权限掩码转换为chmod来使*666 不可执行吗?如果要执行执行 .secretshell,那又如何呢?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

本文包含有关Shell脚本编写的一些错误和基本误解:

  1. 您对多余的 from selenium import webdriver import selenium import resource import sys import os def resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) fn = resource_path('chromedriver.exe') browser = webdriver.Chrome(fn) browser.get('web') # fill in username and hit the next button username = browser.find_element_by_id('user_login') username.send_keys('login') password = browser.find_element_by_id('user_pass') password.send_keys('pass') nextButton1 = browser.find_element_by_id('wp-submit') nextButton1.click() browser.get('web') nextButton3 = browser.find_element_by_id('is_continue_no') nextButton3.click() nextButton4 = browser.find_element_by_class_name('rad10') nextButton4.click() 是对的,这可能是复制粘贴错误。
  2. 您对缺少可执行权限是正确的。作者没有测试他们自己的代码。
  3. 由于bash丢弃了suid,因此整个方法在非基于Debian的系统(例如CentOS或macOS,其中rootsh上失败)。
  4. 作者声称bash,其中ls -l $name将执行name='. ; /bin/rm -Rf /'。这是错误的。
  5. 作者似乎还声称rm将在ls -l "$name"执行命令。这也是错误的。

我建议把整篇文章都带一点盐。