在Linux中,仅键入命令和在执行“/bin/sh”后键入相同的命令有何区别?

4
我知道/bin/sh是一个执行我输入的命令的shell。但事实上,尽管我没有输入/bin/sh,我仍然可以输入任何我想要的命令。
我听说当黑客想攻击某个人时,他或她通常会想要获取/bin/sh。特别是在涉及缓冲区溢出和远程Shell方面,我听说黑客可以利用包含类似于exec("bin/sh", ~something, something);的恶意代码来利用程序中的/bin/sh。
我很好奇为什么黑客要“获取”或执行/bin/sh
此外,我也不确定只输入一个命令和在执行/bin/sh后输入相同命令之间的区别,就像在这个终端交互中看到的那样:
johndoe@localhost $ pwd
/home/johndoe
johndoe@localhost $ /bin/sh
sh-3.2 $ pwd
/home/johndoe
sh-3.2 $ whoami
johndoe
sh-3.2 $ 

尽管我没有执行/bin/sh的权限,但是我仍然可以输入任何我想要输入的命令。那么黑客为什么和什么时候会想要使用/bin/sh呢?

2
请注意,/bin/sh pwd 是完全不同的东西。 - Etan Reisner
3个回答

2
当你登录时,系统会给你一个shell。它可能是/bin/bash,也可能是/bin/sh,或者(不幸的是)/bin/csh,这样你就可以在shell中输入命令。如果你调用/bin/sh,你并没有得到太多:你只是得到了一个新的shell。黑客想要执行/bin/sh的原因是他们可能最初并不在shell中。他们可能正在运行一些程序,该程序应限制他们调用命令的能力,因此获得/bin/sh是一个巨大的收获。坦白地说,黑客并不关心他们是否获得/bin/sh/bin/bash甚至/bin/csh:关键是获得root级别的shell,以便他们可以执行任意命令。如果他们能够让一个setuid程序生成一个shell,他们就可以在该系统上获得root权限。(也就是说,如果他们运行像eject这样在root权限下运行的命令时,当他们欺骗它生成一个shell时,他们得到的shell具有root权限。)

2
首先,关于在您的 shell 上执行命令和在调用 /bin/sh 后执行命令之间的区别(基本上没有显着差异,但我会详细说明):
当您在本地计算机上打开终端时,您会看到一个窗口和一个提示符。该窗口是终端程序,在其内部已经运行了一个 shell。从您在问题中粘贴的 shell 交互来看,您的默认 shell 看起来是 /bin/bash。
简单地说,每当您在 shell 中键入命令时,它都使用 fork 和 exec 的组合来执行命令。因此,当您键入 /bin/sh 时,您的 shell 只是以相同的方式执行它。即一个 shell 执行另一个 shell。在该 shell 内部,您执行更多的命令。没有什么特别不同。它是 shell 的另一个实例,正在执行前一个实例正在执行的相同操作。

当你已经登录到一台电脑并在敲击键盘时,一个shell对你来说并不特别。毕竟它只是另外一个程序而已。但是,它是一个可以方便地执行其他程序的程序。这就是为什么你正在使用它的原因。但是,正是这个属性使得黑客对它感兴趣,因为他们想方便地在其他计算机上执行程序。但是我们稍后再讨论这个问题。只要记住这一点: shell是一个可以方便地执行其他程序的程序

现在让我们来看看为什么黑客对于获取shell很感兴趣:

一个 shell 并不是唯一可以调用 exec(启动另一个程序)的程序。任何程序都可以这样做。当然,shell 是最方便的方法。不幸的是,对于想要破解的人来说,除非他们物理上接触到计算机,否则计算机不会提供 shell。他们与计算机的唯一接口是通过由该计算机运行的公共服务。例如,提供页面的 Web 服务器确实从外部计算机接收输入并为它们生成输出。在此过程中,Web 服务器读取服务器上的文件,执行大量其他操作,然后发送一些字节。它没有执行任何东西(即使它执行了,攻击者也无法直接控制它执行的内容)。也就是说,当您看到 Google 的网页时,您不知道其 Web 服务器在内部执行了什么操作。您只需发送查询并在浏览器中查看结果即可。但是,如果黑客以某种方式欺骗 Web 服务器执行 shell 程序(例如 /bin/sh 或其任何相关程序),并向其传递输入,则攻击者可以在该服务器上随后运行任何程序。如果该公开服务正在以 root 身份运行:那就更好了。这就是攻击者感兴趣的事情。因为这是一种朝着方便地控制系统的方式前进。

-1

当你输入/bin/sh时,你所做的只是将你的shell更改为/bin/sh。如果你正在执行代码,这不会有任何影响。


1
区别在于当前正在运行的 Shell 不同。它们支持略有不同的内容,因此您可以使用它们的方式略有不同。例如,/bin/sh 不支持进程替换,因此 cat < <(echo foo) 将是一个错误,而不是像 bash 一样输出 foo - Etan Reisner
当然没问题,但在他的示例中,运行“whoami”和“pwd”之类的东西不会影响执行。这也不会对编译后的代码产生任何影响。绝对有好处使用“/bin/sh”,即使您使用“/bin/sh”,如果您的shell脚本指定要使用的语言,例如“#!/bin/bash”,它仍将使用bash。 - Paul Frederiksen
取决于您如何运行它,但是是的。我的意思不是说您错了,而是为了添加一些细微差别到答案中。 - Etan Reisner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接