我知道/bin/sh
是一个执行我输入的命令的shell。
但问题是虽然我没有输入/bin/sh
,但我可以输入我想要的任何命令。
我听说当一个黑客想要攻击某人时,他或她通常想得到/bin/sh
。特别是,我听说/bin/sh
与缓冲区溢出和远程shell一起提到,并且这些破解者可以使用/ bin / sh执行的恶意代码(例如exec ("bin/sh", ~something, something);
)来利用程序。
我很好奇为什么他或她试图"得到" /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
?
答案 0 :(得分:2)
当您登录时,您将获得一个shell。它可能是/bin/bash
,/bin/sh
或(遗憾地)/bin/csh
,因此您可以在该shell中键入命令。如果您调用/bin/sh
,那么您获得的收益并不高:您只是获得了一个新的shell。破解者想要执行/bin/sh
的原因是他们最初可能不在shell中。他们可能正在运行一些应该限制他们调用命令的程序,所以获得/bin/sh
是一个巨大的收获。坦率地说,破解者不关心他们是/bin/sh
还是/bin/bash
还是/bin/csh
:关键是要获得根级shell,以便他们可以执行任意命令。如果他们能够使setuid程序产生一个shell,他们就会在盒子上获得root权限。 (也就是说,如果他们运行像eject
这样的命令,当他们欺骗它来生成一个shell时,它们以root身份运行,那么他们获得的shell具有root权限。)
答案 1 :(得分: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是最方便的方法。不幸的是,对于一个可能的破解者,计算机不提供外壳,除非他们有物理访问它。他们与计算机的唯一接口是通过该计算机运行的公共服务。例如服务页面的Web服务器确实从外部计算机获取输入并为它们生成输出。在这个过程中,Web服务器读取服务器上的文件,做一堆其他的东西,然后通过网络发送一些字节。它没有exec
任何东西(或者即使它确实存在,攻击者也无法直接控制它exec
的内容。即,当您看到他们的网页时,您不知道Google的Web服务器在内部做了什么。您只需发送一个查询,然后在浏览器中查看结果。但是如果一个破解者以某种方式欺骗了一个Web服务器exec
一个shell程序(比如/bin/sh
或其任何一个亲戚),并将输入传递给它,那么攻击者可以运行 any 他们随后想要在该服务器上的程序。如果公开的服务以root
运行:甚至更好。这是攻击者有兴趣做的事情。因为这是一种方便控制系统的方法。
答案 2 :(得分:-1)
当你键入/ bin / sh时,你所做的就是将shell更改为/ bin / sh。如果您正在执行代码,它将没有任何区别。