-
Notifications
You must be signed in to change notification settings - Fork 3
怎么在 Exploit 中使用 Powershell
PowerShell 是微软开发的一种脚本语言. 它提供了对 Windows 平台中几乎所有内容的 API 访问, 不易被反措施检测到, 易于学习, 因此对于后期利用期间的渗透测试或针对有效负载执行的利用开发开发来说, 它非常强大. 以 Metasploit 的 windows/smb/psexec_psh.rb 模块为例: 它模仿 SysInternals 的 psexec 实用程序, 有效负载被压缩并从命令行执行, 这使得它在防病毒方面具有一定的隐蔽性. psexec_psh.rb 中只有不到 30 行代码 (不包括描述模块内容的元数据) , 因为大部分工作都是由 Powershell mixin 完成的, 没有比这更容易的了.
命令行将自动尝试检测它正在运行的架构 (x86 或 x86_64) , 以及它包含的有效负载架构. 如果存在不匹配, 它将生成正确的 PowerShell 架构以将有效负载注入其中, 因此无需担心目标系统的架构.
要使用 PowerShell mixin, 请确保满足以下要求:
- 目标机器支持 PowerShell. Vista 或更新版本应该支持它.
- 你必须具有执行 powershell.exe 的权限
- 你必须能够提供系统命令参数.
- 你必须设置命令执行类型攻击才能执行 powershell.exe
- 要将 PowerShell 添加到你的模块, 首先需要它:
require 'msf/core/exploit/powershell'
- 然后将 mixin 包含在
Metasploit3
类的范围内 (或者对于某些人来说可能是Metasploit4
)
include Msf::Exploit::Powershell
- 使用
cmd_psh_payload
方法生成 PowerShell 有效负载:
cmd_psh_payload(payload.encoded, payload_instance.arch.first)
cmd_psh_payload
的实际输出是一个系统命令, 它看起来像以下格式 (作为单行) :
%COMSPEC% /B /C start powershell.exe -Command $si = New-Object
System.Diagnostics.ProcessStartInfo;$si.FileName = 'powershell.exe';
$si.Arguments = ' -EncodedCommand [BASE64 PAYLOAD] ';
$si.UseShellExecute = $false;
$si.RedirectStandardOutput = $true;$si.WindowStyle = 'Hidden';
$si.CreateNoWindow = $True;
$p = [System.Diagnostics.Process]::Start($si);
据漏洞利用的情况, 可以使用许多选项来调整最终命令. 默认情况下, 脚本是压缩的, 但没有编码代替包装器. 这会产生大约 2000 个字符的小命令 (取决于有效负载) .
其中 encode_final_payload
是最值得注意的, 因为它将 Base64 编码完整的有效负载, 给出一个非常简单的命令, 几乎没有坏字符. 但是, 命令长度会因此而增加. 将其与 remove_comspec
相结合意味着有效负载将非常简单:
powershell.exe -nop -ep bypass -e AAAABBBBCCCCDDDD.....==
查看下面 API 文档中的其他高级选项.