OS命令注入:从挫折到获取Shell的曲折之路
Carrie Roberts //
OS命令注入非常有趣。我最近在测试一个Web应用时发现了这个漏洞(感谢Burp Suite扫描器)。我很兴奋,因为我知道即将获得shell,但过程并不像预期的那样简单。以下是我的经历和一些学到的经验。
首先,我知道Web服务器是运行在Red Hat Linux上的Apache。我可以注入以下ping命令并收到对我外部服务器1.2.3.4的命中(假设地址)。开头的分号将注入的命令与应用程序期望的原始命令分开。
|
|
在我的外部服务器上,我可以使用tcpdump命令查看传入的ping请求。
|
|
外部服务器收到三个Ping请求
有了这个,我开始尝试在这种情况下通常会做的所有事情,如此处很好地解释的那样,但都没有成功…
然后我意识到在Red Hat上,netcat可执行文件通常命名为ncat或netcat,所以我修改了命令,但也失败了。
我尝试了以下命令,也失败了…
|
|
我很困惑。我确实有命令注入,但什么都不起作用。我终于发现命令长度被限制在32个字符,可能是因为它首先被写入数据库。我通过反复发送带有不同数量空格的ping命令直到停止工作来发现这一点。
|
|
然后我一时兴起输入了以下命令,令我震惊的是,/etc/passwd文件的内容在服务器响应中返回了。
|
|
我很震惊,因为包括ping命令在内的其他命令都没有在服务器响应中返回命令输出。然后我真的困惑了。我知道echo命令有效,因为我可以在服务器上接收到echo命令的输出,如下所示。(记住我的命令限制在32个字符)。
|
|
我能cat的唯一文件是/etc/passwd。我尝试使用echo将内容写入文件,但似乎我没有对当前目录的写权限。所以我将文件写入tmp目录,但由于32字符命令限制,我无法读取它们以确认是否工作。
为什么我能cat /etc/passwd文件并在服务器响应中获得输出,但不能其他文件?
最后,我更仔细地查看了包含/etc/passwd内容的服务器响应,并意识到它是在响应头中而不是正文中。(列表中有很多用户,它滚出了屏幕)/etc/passwd文件的内容,如下例所示,恰好类似于响应头。
|
|
在这种情况下,关键组件是一个单词后跟冒号,这恰好是包含为响应头的可接受格式。为了测试这个理论,我注入了以下内容。
|
|
我在Web服务器响应头中收到了"some: h"。终于,一切都说得通了,现在我取得了进展。以下命令让我发现没有安装任何版本的netcat,但安装了Python。太好了,Python!"-n"选项告诉echo不要输出尾随的换行符。这很重要,这样下一个命令的输出将在同一行上,并保持作为响应头包含的正确格式。
|
|
我使用msfvenom创建Python代码以连接回我的Metasploit监听器,如此处所述。我将Python脚本命名为"z"并放在我的主目录中。我在自己的Linux机器上测试了Python代码,但一直收到"TypeError: expected string without null bytes"。
我意识到在Metasploit处理程序上启用了阶段编码器。当我使用"set EnableStageEncoding false"禁用阶段编码器时,它工作了。
接下来,我需要将这个Python代码写入Web服务器上的文件。为此,我将文件托管在我的Web服务器上,并使用wget通过此注入命令将文件写入磁盘。
|
|
然后用这个执行它。
|
|
这成功地为我建立了一个Meterpreter会话,但由于连接不是真正的"tty",我在某些方面受到限制。我记得在最近的"夺旗"活动中遇到了这样的挑战,一点谷歌搜索再次找到了解决方案。
|
|
就这样。我通过OS命令注入获取shell的迂回方法。事后看来,它本可以如此简单和快速,但嘿,这就是黑客。
加入BHIS博客邮件列表 - 当我们发布新博客、网络广播和播客时获得通知。 [jetpack_subscription_form show_only_email_and_button=“true” custom_background_button_color=“undefined” custom_text_button_color=“undefined” submit_button_text=“Subscribe” submit_button_classes=“undefined” show_subscribers_total=“true”]