我知道/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
呢?
当您登录时,会得到一个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,那么他们就可以在这个盒子上获得根。(也就是说,如果他们在诱骗生成shell时运行像eject
这样的以root身份运行的命令,那么他们得到的shell就拥有root权限。)
首先,关于在shell上执行命令和在调用/bin/sh
后执行命令之间的区别(基本上没有显著区别,但我会详细说明):
当你在本地机器上打开一个终端时,你会看到一个窗口和一个提示。该窗口是一个终端程序,其中有已经运行的shell。从您在问题中粘贴的shell交互来看,您的默认shell似乎是/bin/bash
。
简单地说,每当您在shell中键入命令时,它都会使用fork
和exec
的组合来执行它。因此,当您键入/bin/sh
时,您的shell只是以相同的方式执行它。即一个shell执行另一个shell。在这个shell中,您可以执行更多的命令。没有什么特别的不同。它是shell的另一个实例,执行与上一个实例相同的操作。
当你已经登录电脑并坐在电脑前打字时,外壳对你来说并不是特别的。毕竟这只是另一个节目。但是它是一个可以方便地执行其他程序的程序。这就是你使用它的原因。但这个特性让破解者很感兴趣,因为他们想方便地在其他计算机上执行程序。但我们稍后会讨论这个问题。不过,请记住:shell是一个可以方便地执行其他程序的程序。
现在来谈谈为什么破解者对获得炮弹感兴趣:
shell并不是唯一可以调用exec
(开始执行另一个程序)的程序。任何程序都可以做到这一点。当然,外壳是最方便的方法。不幸的是,对于一个想要破解的人来说,除非他们可以物理访问外壳,否则计算机不会提供外壳。他们与计算机的唯一接口是通过该计算机运行的公共服务。例如,提供页面的web服务器确实从外部计算机获取输入并为它们产生输出。在这个过程中,web服务器读取服务器上的文件,做一些其他事情,然后通过网络发送一些字节。它没有exec
任何内容(或者即使它有,攻击者也无法直接控制它exec
的内容)。也就是说,当你看到谷歌的网页时,你不知道谷歌的网络服务器在内部做什么。您只需发送一个查询,然后在浏览器中查看结果。但是,如果一个破解者以某种方式欺骗网络服务器exec
一个shell程序(比如/bin/sh
或其任何亲属),并将输入传递给它,那么攻击者就可以在该服务器上运行他们随后想要的任何程序。如果公开的服务是以root
运行的:那就更好了。这就是攻击者感兴趣的行为。因为这是一种对系统进行方便控制的方式。
当您键入/bin/sh时,您所要做的就是将shell更改为/bin/sh。如果您正在执行代码,则不会有任何区别。